ASP .Net Core 中介軟體的使用(一):搭建靜態檔案伺服器/訪問指定檔案

學習中的苦與樂發表於2020-12-16

前言

隨著Asp .Net Core的升級迭代,很多開發者都逐漸傾向於.net core開發。

.net core是一個跨平臺的應用程式,可以在windows、Linux、macOS系統上進行開發和部署,是一個體系結構更精簡模組化框架。

  • 生成WebUi和WebApi的統一使用場景;
  • 整合新的客戶端框架和開發工作流;
  • 前後端分離為兩個dll(view.dll,web.dll),更容易迭代,可以使用應用版本控制;
  • 內建依賴注入,更高效安全;
  • 高效能模組化的HTTP請求管道;
  • 能夠在iis,nginx,apache,docker上進行託管;
  • web開發方式更簡化;

 

釋語

ASP.Net Core接收並處理的大部分是針對靜態檔案的請求,最常見的是JavaScript、CSS樣式和圖片。

比較有意思的是,他提供了中介軟體來處理針對於靜態檔案的請求,這種請求可以通過http請求的方式獲取指定的物理檔案,並且將其所在的物理目錄結構展示出來。

通過http請求獲取的web資源大部分來源於儲存在伺服器磁碟上的靜態檔案。

為什麼使用靜態檔案伺服器?因為這樣不需要安裝web伺服器,開啟程式即可使用,方便快捷。


 詳解

說了這麼多,我們來實際操作一下:

使用的是  StaticFiles  中介軟體。

我們先建立一個Asp .Net Core Web應用程式,操作方式如下:

1、建立一個名為NetCoreFileServer的專案,選擇web引用程式,相應的中介軟體會自動載入進來

 

 

 選擇Web引用程式

 

 


 

釋出物理檔案

建立專案後,在wwwroot 資料夾下建立一個圖片資料夾,新增一行圖片,然後將程式執行起來,

網址直接導航到圖片:http://localhost:10610/img/Lighthouse.jpg

 

 

 

預設的話只能訪問wwwroot資料夾下面的檔案,如果需要訪問非wwwroot檔案下的檔案,就需要在中介軟體中擴充套件一下;

開啟Startup.cs,找到 Configure 方法,在app.UseStaticFiles();後面新增一個擴充套件方法,如下標紅部分:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            //這是新增的擴張方法
            //設定訪問檔案
            app.UseStaticFiles(new StaticFileOptions
            {
                //配置除了預設的wwwroot檔案中的靜態檔案以外的資料夾提供 Web 根目錄外的檔案 ,
                //經過此配置以後,就可以訪問非wwwroot檔案下的檔案
                FileProvider = new PhysicalFileProvider(
                  Path.Combine(Directory.GetCurrentDirectory(), "Image")),
                RequestPath = "/Image",
            });

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

然後訪問一下非wwwroot資料夾下的檔案,http://localhost:10610/Image/Hydrangeas.jpg

這樣就能正常訪問檔案了,其html檔案等訪問方式一樣的操作。

 


 

靜態檔案伺服器

按照類似的方式,我們來做一下靜態檔案的訪問;

同理,我們需要在Startup.cs中找到 Configure 方法,在app.UseStaticFiles();後面新增一個擴充套件方法,如下標紅部分:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            //這是新增的擴張方法
            //設定訪問檔案
            app.UseStaticFiles(new StaticFileOptions
            {
                //配置除了預設的wwwroot檔案中的靜態檔案以外的資料夾提供 Web 根目錄外的檔案 ,
                //經過此配置以後,就可以訪問非wwwroot檔案下的檔案
                FileProvider = new PhysicalFileProvider(
                  Path.Combine(Directory.GetCurrentDirectory(), "Image")),
                RequestPath = "/Image",
            });

            //配置訪問指定檔案磁碟
            var dir = new DirectoryBrowserOptions();
            dir.FileProvider = new PhysicalFileProvider(@"E:\");
            app.UseDirectoryBrowser(dir);
            var staticfile = new StaticFileOptions();
            staticfile.FileProvider = new PhysicalFileProvider(@"E:\");//指定目錄 這裡指定E盤,也可以是其它目錄            
            app.UseStaticFiles(staticfile);

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

 

配置好後啟動程式進行訪問得到目錄,點選指定檔案即可訪問

 

 

這樣我們就能瀏覽指定磁碟的檔案了。

你會發現有些檔案開啟會404,有些又可以開啟。那是因為MIME 沒有識別出來。

我們可以手動設定這些 MIME ,也可以給這些未識別的設定一個預設值,如下標紅部分。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            //這是新增的擴張方法
            //設定訪問檔案
            app.UseStaticFiles(new StaticFileOptions
            {
                //配置除了預設的wwwroot檔案中的靜態檔案以外的資料夾提供 Web 根目錄外的檔案 ,
                //經過此配置以後,就可以訪問非wwwroot檔案下的檔案
                FileProvider = new PhysicalFileProvider(
                  Path.Combine(Directory.GetCurrentDirectory(), "Image")),
                RequestPath = "/Image",
            });

            //配置訪問指定檔案磁碟
            var dir = new DirectoryBrowserOptions();
            dir.FileProvider = new PhysicalFileProvider(@"E:\");
            app.UseDirectoryBrowser(dir);
            var staticfile = new StaticFileOptions();
            staticfile.FileProvider = new PhysicalFileProvider(@"E:\");//指定目錄 這裡指定E盤,也可以是其它目錄
            staticfile.ServeUnknownFileTypes = true;
            staticfile.DefaultContentType = "application/x-msdownload"; //設定預設  MIME
            var provider = new FileExtensionContentTypeProvider();
            provider.Mappings.Add(".log", "text/plain");//手動設定對應MIME
            staticfile.ContentTypeProvider = provider;
            app.UseStaticFiles(staticfile);

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

設定好以後,對於未識別的,預設為下載。 .log 就被我手動設定成文字方式。

對於前面的這麼多設定,StaticFiles 提供了一種簡便的寫法。UseFileServer

       app.UseFileServer(new FileServerOptions()
            {
                FileProvider = new PhysicalFileProvider(@"C:\"),
                EnableDirectoryBrowsing = true
            });

 

如果需要加上MIME,StaticFileOptions 需要繫結上。

這樣就弄好一個靜態檔案伺服器了,同一個區域網內傳輸檔案就可以直接飛速下載。

參考文件1:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-2.1&tabs=aspnetcore2x#serve-static-files
參考文件2:https://www.cnblogs.com/linezero/p/5541326.html

 

 

歡迎關注訂閱我的微信公眾平臺【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂
公眾號:熊澤有話說
出處: https://www.cnblogs.com/xiongze520/p/14143581.html
創作不易,版權歸作者和部落格園共有,轉載或者部分轉載、摘錄,請在文章明顯位置註明作者和原文連結。  

 

相關文章