ASP.NET Core + SPA 未知靜態檔案類型處理

總結

於 app.UseStaticFiles 及 app.UseSpaStaticFiles 的參數 StaticFileOptions 中,加入已組態 MIME 的 FileExtensionContentTypeProvider。

緣由

一個 ASP.NET Core Web API + Host SPA 的專案,裝載在 IIS 上。
SPA 中功能要下載 7zip 檔案,結果發覺得到 404 的回應。
但開發時是不會有這問題的,差別在於開發時 SPA 使用的是自己的 Web Server (Vite),ASP.NET Core 在反向要求它。
經驗告訴我,應該在 web.config 處理 MIME 的設定即可。
但事情未如預期,還是一樣 404。

參考

用了 "asp.net core" "static file" 為關鍵字,找了一堆文章,才發現以下這篇。
 
 
有了  FileExtensionContentTypeProvider 這線索。
由於專案有使用 UseStaticFiles ,所以接管了靜態檔案的要求,因此在 web.config 新增 MIME 是沒有用處的。
搭配此文。
 
 
參考後,大致上知道該如何處理。

方案

嘗試了一下,三個地方要處理。

定義 FileExtensionContentTypeProvider

先定義要新增的 MIME 類型。
 
static readonly IDictionary<string, string> FILE_EXTENSION_CONTENT_TYPE_SET = new Dictionary<string, string>()
        {
            {".7z", "application/x-7z-compressed" }
        };

再定義、設定 FileExtensionContentTypeProvider。
 
var fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();

            foreach (var kvp in FILE_EXTENSION_CONTENT_TYPE_SET)
            {
                if (!fileExtensionContentTypeProvider.Mappings.ContainsKey(
                    kvp.Key
                    )
                    )
                {
                    fileExtensionContentTypeProvider.Mappings.Add(
                        kvp
                        );
                }

            }

UseStaticFiles

修改 UseStaticFiles 部分
 
app.UseStaticFiles(new StaticFileOptions()
            {
                RequestPath = "/wwwroot",
                ContentTypeProvider = fileExtensionContentTypeProvider,
            });

UseSpaStaticFiles

這部分要說明一下,開發時 app.UseSpaStaticFiles 整個拿掉都沒問題。
但裝載在 IIS 上就會出問題,所以還是需要 app.UseSpaStaticFiles 。

app.UseSpaStaticFiles(
                new StaticFileOptions()
                {
                    ContentTypeProvider = fileExtensionContentTypeProvider,
                }
                );

留言