亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析如何利用一個(gè)ASP.NET Core應(yīng)用來發(fā)布靜態(tài)文件

 更新時(shí)間:2016年12月07日 09:22:30   作者:Artech  
本文主要通過一些簡單的實(shí)例來體驗(yàn)一下如何在一個(gè)ASP.NET Core應(yīng)用中發(fā)布靜態(tài)文件。針對不同格式的靜態(tài)文件請求的處理,ASP.NET Core為我們提供了三個(gè)中間件,它們將是本系列文章論述的重點(diǎn)。有需要的朋友可以看下

雖然ASP.NET Core是一款“動(dòng)態(tài)”的Web服務(wù)端框架,但是在很多情況下都需要處理針對靜態(tài)文件的請求,最為常見的就是這對JavaScript腳本文件、CSS樣式文件和圖片文件的請求。針對不同格式的靜態(tài)文件請求的處理,ASP.NET Core為我們提供了三個(gè)中間件,它們將是本系列文章論述的重點(diǎn)。不過在針對對它們展開介紹之前,我們照理通過一些簡單的實(shí)例來體驗(yàn)一下如何在一個(gè)ASP.NET Core應(yīng)用中發(fā)布靜態(tài)文件。

目錄

一、以Web的形式讀取文件

二、瀏覽目錄內(nèi)容

三、顯示默認(rèn)頁面

四、映射媒體類型

一、以Web的形式讀取文件

我們創(chuàng)建的演示實(shí)例是一個(gè)簡單的ASP.NET Core控制臺(tái)應(yīng)用,它具有如下圖所示的項(xiàng)目結(jié)構(gòu)。我們可以看到在默認(rèn)作為WebRoot的目錄(wwwroot)下,我們將JavaScript腳本文件、CSS樣式文件和圖片文件存放到對應(yīng)的子目錄(js、css和img)下,我們將把這個(gè)目錄的所有文件以Web的形式發(fā)布出來,客戶端可以訪問相應(yīng)的URL來獲取這些文件。

針對靜態(tài)文件的請求是通過一個(gè)名為StaticFileMiddleware的中間件來實(shí)現(xiàn)的,這個(gè)中間件類型定義在NuGet包“Microsoft.AspNetCore.StaticFiles”中,所以我們需要預(yù)先按照這個(gè)NuGet包。整個(gè)應(yīng)用只包含如下所示的這幾行代碼,StaticFileMiddleware這個(gè)中間件的注冊是通過調(diào)用ApplicationBuilder的擴(kuò)展方法UseStaticFiles來完成的。

  public class Program
  {
   public static void Main()
    {
     new WebHostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseKestrel()
       .Configure(app => app.UseStaticFiles())
        .Build()
       .Run();
    }
  }

除了注冊必需的StaticFileMiddleware中間件之外,我們還調(diào)用了WebHostBuilder的UseContentRoot方法將當(dāng)前項(xiàng)目的根目錄作為ContentRoot目錄。我們知道ASP.NET Core應(yīng)用具有兩個(gè)重要的根目錄,它們分別是ContentRoot和WebRoot,后者也是對外發(fā)布的靜態(tài)文件默認(rèn)使用的根目錄。由于WebRoot目錄的默認(rèn)路徑就是“{contentroot}/wwwroot”,所示上面這段程序就是將項(xiàng)目中的這個(gè)wwwroot目錄下的所有靜態(tài)文件發(fā)布出來。

當(dāng)這個(gè)程序運(yùn)行之后,我們就可以通過向?qū)?yīng)URL發(fā)送HTTP請求的方式來獲取某個(gè)的文件,這個(gè)URL由文件相當(dāng)于wwwroot目錄的路徑來決定。比如JPG文件“~/wwwroot/img/dophin1.jpg”對應(yīng)的URL為“http://

localhost:5000/img/dophin1.jpg”。我們直接利用瀏覽器訪問這個(gè)URL,目標(biāo)圖片會(huì)直接顯示出來。

上面我們通過一個(gè)簡單的實(shí)例將WebRoot所在目錄下的所有靜態(tài)文件直接發(fā)布出來。如果我們需要發(fā)布的靜態(tài)文件存儲(chǔ)在其他目錄下呢?依舊是演示的這個(gè)應(yīng)用,現(xiàn)在我們將一些文檔存儲(chǔ)在如下圖所示的“~/doc/”目錄下并以Web的形式發(fā)布出來,我們的程序又該如何編寫呢?

我們知道ASP.NET Core應(yīng)用大部分情況下都是利用一個(gè)FileProvider對象來讀取文件的,它在處理針對靜態(tài)文件的請求是也不例外。對于我們調(diào)用ApplicationBuilder的擴(kuò)展方法UseStaticFiles方法注冊的這個(gè)類型為StaticFileMiddleware的中間件,其內(nèi)部具有一個(gè)FileProvider和請求路徑的映射關(guān)系。如果調(diào)用UseStaticFiles方法沒有指定任何的參數(shù),那么這個(gè)映射關(guān)系的請求路徑就是應(yīng)用的基地址(PathBase),而FileProvider自然就是指向WebRoot目錄的PhysicalFileProvider。

上述的這個(gè)需求可以通過顯式注冊這個(gè)映射的方式來實(shí)現(xiàn),為此我們在現(xiàn)有程序的基礎(chǔ)上額外添加了一次針對UseStaticFiles方法的調(diào)用,并通過指定的參數(shù)(是一個(gè)StaticFileOptions對象)顯式指定了采用的FileProvider(針對“~/doc/”的PhysicalFileProvider)和請求路徑(“/documents”)。

  public class Program
  {
    public static void Main()
    {
     string contentRoot = Directory.GetCurrentDirectory();
      new WebHostBuilder()
        .UseContentRoot(contentRoot)
        .UseKestrel()
       .Configure(app => app
         .UseStaticFiles()
         .UseStaticFiles(new StaticFileOptions {
            FileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "doc")),
            RequestPath = "/documents"
           }))
        .Build()
       .Run();
    }
  }

按照上面這段程序指定的映射關(guān)系,對于存儲(chǔ)在“~/doc/”目錄下的這個(gè)PDF文件(“checklist.pdf”),發(fā)布在Web上的URL為“http://localhost:5000/documents/checklist.pdf”。當(dāng)我們在瀏覽器上請求這個(gè)地址時(shí),該P(yáng)DF文件的內(nèi)容將會(huì)按照如下圖所示的形式顯示在瀏覽器上。

二、瀏覽目錄內(nèi)容

注冊的StaticFileMiddleware中間件只會(huì)處理針對某個(gè)具體靜態(tài)文件的額請求,如果我們向針對某個(gè)目錄的URL發(fā)送HTTP請求(比如“http://localhost:5000/img/”),得到的將是一個(gè)狀態(tài)為404的響應(yīng)。不過我們可以通過注冊另一個(gè)名為DirectoryBrowserMiddleware的中間件來顯示請求目錄的內(nèi)容。具體來說,這個(gè)中間件會(huì)返回一個(gè)HTML頁面,請求目錄下的所有文件將以表格的形式包含在這個(gè)頁面中。對于我們演示的這個(gè)應(yīng)用來說,我們可以按照如下的方式調(diào)用UseDirectoryBrowser方法來注冊這個(gè)DirectoryBrowserMiddleware中間件。

  public class Program
  {
   public static void Main()
    {
      string contentRoot = Directory.GetCurrentDirectory();
      IFileProvider fileProvider = new PhysicalFileProvider(
        Path.Combine(contentRoot, "doc"));
      new WebHostBuilder()
       .UseContentRoot(contentRoot)
       .UseKestrel()
       .Configure(app => app
         .UseStaticFiles()
         .UseStaticFiles(new StaticFileOptions {
           FileProvider = fileProvider,
           RequestPath = "/documents"
          })
         .UseDirectoryBrowser()
         .UseDirectoryBrowser(new DirectoryBrowserOptions {
             FileProvider = fileProvider,
             RequestPath = "/documents"
         }))
       .Build()
       .Run();
    }
  }

當(dāng)上面這個(gè)應(yīng)用啟動(dòng)之后,如果我們利用瀏覽器向針對某個(gè)目錄的URL(比如“http://localhost:5000/”或者“http://localhost:5000/img/”),目標(biāo)目錄的內(nèi)容(包括子目錄和文件)將會(huì)以下圖所示的形式顯示在一個(gè)表格中。不僅僅如此,子目錄和文件均會(huì)顯示為鏈接,指向目標(biāo)目錄或者文件的URL。

三、顯示默認(rèn)頁面

從安全的角度來講,利用注冊的UseDirectoryBrowser中間件顯示一個(gè)目錄瀏覽頁面會(huì)將整個(gè)目標(biāo)目錄的接口和所有文件全部暴露出來,所以這個(gè)中間件需要根據(jù)自身的安全策略謹(jǐn)慎使用。對于針對目錄的請求,另一種更為常用的響應(yīng)策略就是顯示一個(gè)保存在這個(gè)目錄下的默認(rèn)頁面。按照約定,作為默認(rèn)頁面的文件一般采用如下四種命名方式:default.htm、default.html、index.htm或者index.html。針對目標(biāo)目錄下默認(rèn)頁面的呈現(xiàn)實(shí)現(xiàn)在一個(gè)名為DefaultFilesMiddleware的中間件中,我們演示的這個(gè)應(yīng)用可以按照如下的方式調(diào)用UseDefaultFiles方法來注冊這個(gè)中間件。

  public class Program
  {
    public static void Main()
    {
      string contentRoot = Directory.GetCurrentDirectory();
      IFileProvider fileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "doc")); 
      new WebHostBuilder()
        .UseContentRoot(contentRoot)
        .UseKestrel()
        .Configure(app => app
          .UseDefaultFiles()
          .UseDefaultFiles(new DefaultFilesOptions{
            RequestPath = "/documents",
            FileProvider = fileProvider,
          })
          .UseStaticFiles()
         .UseStaticFiles(new StaticFileOptions
          {
            FileProvider = fileProvider,
            RequestPath = "/documents"
          })
          .UseDirectoryBrowser()
          .UseDirectoryBrowser(new DirectoryBrowserOptions
          {
           FileProvider = fileProvider,
           RequestPath = "/documents"
          }))
        .Build()
        .Run();
    }
  }

現(xiàn)在我們在“~/wwwroot/img/”目錄下創(chuàng)建一個(gè)名為index.htm的默認(rèn)頁面,現(xiàn)在利用瀏覽器訪問這個(gè)目錄對應(yīng)的URL(“http://localhost:5000/img/”),顯示就時(shí)這個(gè)頁面的內(nèi)容。

我們必須在注冊StaticFileMiddleware和DirectoryBrowserMiddleware之前注冊DefaultFilesMiddleware,否則它起不了任何作用。由于DirectoryBrowserMiddleware和DefaultFilesMiddleware這兩個(gè)中間件處理的均是針對目錄的請求,如果DirectoryBrowserMiddleware先被注冊,那么顯示的總是目錄的內(nèi)容。若DefaultFilesMiddleware先被注冊,在默認(rèn)頁面不存在情況下回顯示目錄的內(nèi)容。至于為什么要先于StaticFileMiddleware之前注冊DefaultFilesMiddleware,則是因?yàn)楹笳呤峭ㄟ^采用URL重寫的方式實(shí)現(xiàn)的,也就是說這個(gè)中間件會(huì)將針對目錄的請求改寫成針對默認(rèn)頁面的請求,而最終針對默認(rèn)頁面的請求還得依賴StaticFileMiddleware完成。

DefaultFilesMiddleware中間件在默認(rèn)情況下總是以約定的名稱(default.htm、default.html、index.htm或者index.html)在當(dāng)前請求的目錄下定位默認(rèn)頁面。如果我們希望作為默認(rèn)頁面的文件不能按照這樣的約定命名(比如readme.htm),我們需要按照如下的方式顯式指定默認(rèn)頁面的文件名。

 public class Program
  {
    public static void Main()
    {
      string contentRoot = Directory.GetCurrentDirectory();
      IFileProvider fileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "doc"));
      DefaultFilesOptions options1 = new DefaultFilesOptions();
      DefaultFilesOptions options2 = new DefaultFilesOptions{
        RequestPath = "/documents",
        FileProvider = fileProvider
     };
     options1.DefaultFileNames.Add("readme.htm");
      options2.DefaultFileNames.Add("readme.htm");
  
      new WebHostBuilder()
        .UseContentRoot(contentRoot)
        .UseKestrel()
        .Configure(app => app
          .UseDefaultFiles(options1)
          .UseDefaultFiles(options2)
          .UseStaticFiles()
          .UseStaticFiles(new StaticFileOptions{
            FileProvider = fileProvider,
            RequestPath = "/documents"
          })
          .UseDirectoryBrowser()
          .UseDirectoryBrowser(new DirectoryBrowserOptions{
            FileProvider = fileProvider,
            RequestPath = "/documents"
          }))
      .Build()
      .Run();
    }
  }

四、映射媒體類型

通過上面演示的實(shí)例可以看出,瀏覽器能夠正確的將請求的目標(biāo)文件的內(nèi)容正常的呈現(xiàn)出來。對HTTP協(xié)議具有基本了解的人都應(yīng)該知道,響應(yīng)的文件能夠在支持的瀏覽器上呈現(xiàn)具有一個(gè)基本的前提,那就是響應(yīng)消息通過Content-Type報(bào)頭攜帶的媒體類型必須與內(nèi)容一致。我們的實(shí)例演示了針對兩種類型文件的請求,一種是JPG文件,另一種是PDF文件,對應(yīng)的媒體類型分別是“image/jpg”和“application/pdf”,那么StaticFileMiddleware是如何正確解析出正確的媒體類型的呢?

StaticFileMiddleware針對媒體類型的解析是通過一個(gè)名為ContentTypeProvider的對象來實(shí)現(xiàn)的,而默認(rèn)使用的則是一個(gè)FileExtensionContentTypeProvider對象。顧名思義,F(xiàn)ileExtensionContentTypeProvider是根據(jù)文件的擴(kuò)展命名來解析媒體類型的。FileExtensionContentTypeProvider內(nèi)部預(yù)定了數(shù)百種常用文件擴(kuò)展名與對應(yīng)媒體類型之間的映射關(guān)系,所以如果我們發(fā)布的靜態(tài)文件具有標(biāo)準(zhǔn)的擴(kuò)展名,StaticFileMiddleware就能為對應(yīng)的響應(yīng)賦予正確的媒體類型。

那么如果某個(gè)文件的擴(kuò)展名沒有在這個(gè)預(yù)定義的映射之中,或者我們需要某個(gè)預(yù)定義的擴(kuò)展名匹配不同的媒體類型,我們應(yīng)該如何解決呢?還是針對我們演示的這個(gè)實(shí)例,想在我將“~/wwwroot/img/ dophin1.jpg”這個(gè)文件的擴(kuò)展名改成“.img”,毫無疑問StaticFileMiddleware將能為針對該文件的請求解析出正確媒體類型。這個(gè)問題具有若干不同的解決方案,第一種方案就是讓StaticFileMiddleware支持不能識(shí)別的文件類型,并為它們設(shè)置一個(gè)默認(rèn)的媒體類型,如下所示了具體采用的編程方式。

 public class Program
  {
    public static void Main()
    { 
      new WebHostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory();)
        .UseKestrel()
        .Configure(app => app.UseStaticFiles(new StaticFileOptions {
          ServeUnknownFileTypes = true,
          DefaultContentType   = "image/jpg"
        }))
        .Build()
        .Run();
    }
  }

上述這種解決方案只能設(shè)置一種默認(rèn)媒體類型,如果具有多種需要映射成不同媒體類型的非識(shí)別文件類型,采用這種方案就無能為力了,所以最根本的解決方案還是需要將不能識(shí)別的文件類型和對應(yīng)的媒體類型進(jìn)行映射。由于StaticFileMiddleware使用的ContentTypeProvider是可以定制的,我們可以按照如下的方式顯式地為StaticFileMiddleware指定一個(gè)FileExtensionContentTypeProvider對象作為它的ContentTypeProvider,然后將取缺失的映射添加到這個(gè)FileExtensionContentTypeProvider對象上。

  public class Program
  {
    public static void Main()
    {
      FileExtensionContentTypeProvider contentTypeProvider = new FileExtensionContentTypeProvider();
      contentTypeProvider.Mappings.Add(".img", "image/jpg");
   
      new WebHostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseKestrel()
        .Configure(app => app.UseStaticFiles(new StaticFileOptions{
          ContentTypeProvider = contentTypeProvider
        }))
        .Build()
        .Run();
    }
  }

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • .NET6+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例詳解

    .NET6+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例詳解

    在實(shí)際工作中,經(jīng)常會(huì)有一些需要定時(shí)操作的業(yè)務(wù),如:定時(shí)發(fā)郵件,定時(shí)統(tǒng)計(jì)信息等,那么如何實(shí)現(xiàn)才能使得我們的項(xiàng)目整齊劃一呢?本文通過一些簡單的小例子,簡述在.Net6+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的一些基本操作,如有不足之處,還請指正
    2023-03-03
  • asp.net刪除文件session丟失

    asp.net刪除文件session丟失

    如果你曾經(jīng)修改了ASP.NET應(yīng)用程序(dll文件),與修改了bin文件夾或Web.config文件(添加/刪除/重命名的文件等),而該網(wǎng)站在運(yùn)行,你可能已經(jīng)注意到,這將導(dǎo)致在AppDomain的重新啟動(dòng)
    2010-09-09
  • .net WCF簡單實(shí)例詳解(5)

    .net WCF簡單實(shí)例詳解(5)

    這篇文章主要為大家詳細(xì)介紹了.net WCF簡單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • asp.net中List的使用方法

    asp.net中List的使用方法

    .net真是方便,這幾天幫朋友寫了個(gè)小軟件,用它還真感覺輕松自在,很稱手,自帶的類庫既豐富又實(shí)用
    2008-10-10
  • 使用vs2019加.net core 對WeiApi的創(chuàng)建過程詳解

    使用vs2019加.net core 對WeiApi的創(chuàng)建過程詳解

    這篇文章主要介紹了使用vs2019加.net core 對WeiApi的創(chuàng)建,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的完整實(shí)例

    ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core+Docker+Jenkins實(shí)現(xiàn)持續(xù)集成的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • asp.net 日期函數(shù) 某月的第一天和最后一天的日期

    asp.net 日期函數(shù) 某月的第一天和最后一天的日期

    常用asp.net日期操作函數(shù)-得到某月的第一天和最后一天的日期
    2008-12-12
  • ASP.NET 清除模式窗口數(shù)據(jù)緩存的操作方式

    ASP.NET 清除模式窗口數(shù)據(jù)緩存的操作方式

    模式窗口showModalDialog()彈出頁面在asp.net中經(jīng)常用到,接下來為大家介紹下清除模式窗口緩存數(shù)據(jù)的問題
    2013-04-04
  • ASP.NET?Core獲取正確查詢字符串參數(shù)示例

    ASP.NET?Core獲取正確查詢字符串參數(shù)示例

    這篇文章主要為大家介紹了ASP.NET?Core正確獲取查詢字符串參數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 如何在ASP.NET Core 的任意類中注入Configuration

    如何在ASP.NET Core 的任意類中注入Configuration

    這篇文章主要介紹了如何在 ASP.NET Core 的任意類中注入Configuration ,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下
    2021-04-04

最新評論