IIS 拒絕提供靜態 .gltf 文件
我正在使用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 存在相同的問題。
重新啟動 IIS
iisreset /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。