Iis

IIS 拒絕提供靜態 .gltf 文件

  • December 1, 2020

我正在使用three.js 庫GLTFLoader.js我下載了一些帶有.gltf 副檔名的免費 3D 模型(它還帶有一個 .bin 文件和一個帶有紋理的文件夾)。

我可以從 IIS (10) 作為靜態內容訪問此文件夾中的所有其他文件,但返回 404 頁面的 .gltf 文件除外。

此時我已將 MIME 映射添加到任何地方的 IIS(ASP.NET Core 2.2 站點的 web.config、IIS 的頂級、IIS 的站點級別)。它是模型/gltf+json。我嘗試了 application/json 和 application/octet-stream 以防萬一。它在所有情況下都返回 404。

我嘗試允許伺服器使用萬用字元 MIME 映射來提供所有靜態文件。即使這樣也失敗了。

如果我將 .gltf 文件重命名為 .json,它可以正常工作。

我嘗試了 FailedRequestTracing,它為我提供了一個巨大的 xml 文件。經歷這些並沒有對我有任何啟發,但也許我只是對 IIS 的內部工作方式知之甚少。

IISExpress 上的同樣問題(從 Visual Studio 2019 執行)。

我嘗試使用https://glb-packer.glitch.me/將 .gltf 轉換為 .glb,但 .glb 副檔名與 IIS -> 404 存在相同的問題。

重新啟動 IISiisreset /restart並沒有幫助。

我沒有使用任何 URL 重寫規則。

將選項添加ServeUnknownFileTypes = true到 StaticFiles 中間件沒有任何區別。

你以前遇到過這樣的問題嗎?關於下一步嘗試什麼的任何建議?

更新:我設法將問題縮小到 AspNetCoreModuleV2 處理程序。如果不存在,則正確提供 .gltf 文件。現在,我確實需要這個模組來執行,所以這是個問題。

更新:終於想通了……我會為下一個不幸的靈魂偶然發現這個問題發布答案。

原來我正在使用自定義 FileServerProvider 因為我需要 IoC 容器稍後將其註入一些控制器。(如果 .gltf 在 wwwroot 中,則類似的修復適用於 Configure 方法中的 UseStaticFiles()。)

在配置服務中:

var fileProviderOptions = new FileServerOptions
{
   FileProvider = new PhysicalFileProvider(_ContentStorePath),
   RequestPath = new PathString("/ContentStore")
};
fileProviderOptions.StaticFileOptions.ContentTypeProvider = new FileExtensionContentTypeProvider();
((FileExtensionContentTypeProvider)fileProviderOptions
   .StaticFileOptions.ContentTypeProvider).Mappings[".gltf"] = "model/gltf+json";
services.AddSingleton<IFileServerProvider>(new FileServerProvider(
   new List<FileServerOptions> { fileProviderOptions }
));

所以,我不得不告訴它程式碼中的 gltf 是什麼。StaticFileOptions 是只讀的,而 ContentTypeProvider 是一個介面,所以需要跳過幾圈。

回想起來,也許這個問題畢竟更適合 StackOverflow。

引用自:https://serverfault.com/questions/982383