我在用three.js 库和GLTFLoader.js。我下载了一些免费的 3D 模型.gltf 扩展名(它还附带一个 .bin 文件和一个带有纹理的文件夹)。
我可以从 IIS(10)访问此文件夹中的所有其他文件作为静态内容,除了返回 404 页面的 .gltf 文件之外。
此时,我已在所有位置将 MIME 映射添加到 IIS(ASP.NET Core 2.2 站点的 web.config、IIS 的顶层、IIS 的站点级别)。它是 model/gltf+json。为了以防万一,我尝试了 application/json 和 application/octet-stream。它在所有情况下都返回 404。
我尝试允许服务器使用通配符 MIME 映射来提供所有静态文件。但还是失败了。
如果我将 .gltf 文件重命名为 .json,它可以正常工作。
我尝试了 FailedRequestTracing,它给了我一个巨大的 xml 文件。查看它并没有给我带来任何启发,但也许我对 IIS 的内部工作原理了解不够。
IISExpress 上也有同样的问题(从 Visual Studio 2019 运行)。
我尝试使用将 .gltf 转换为 .glbhttps://glb-packer.glitch.me/但 .glb 扩展名表现出与 IIS -> 404 相同的问题。
重新启动 IISiisreset /restart
没有帮助。
我没有使用任何 URL 重写规则。
向 StaticFiles 中间件添加选项ServeUnknownFileTypes = true
并没有什么区别。
您以前遇到过类似的问题吗?对于下一步该怎么做,您有什么建议吗?
更新:我已设法将问题缩小到 AspNetCoreModuleV2 处理程序。当不存在时,.gltf 文件可以正确提供。现在,我确实需要运行此模块,所以这是一个问题。
更新:终于明白了...我将为下一个不幸发现这个问题的人发布一个答案。
答案1
事实证明,我使用的是自定义 FileServerProvider,因为我需要 IoC 容器以便稍后将其注入到某些控制器中。 (如果 .gltf 位于 wwwroot 中,则类似的修复方法也适用于 Configure 方法中的 UseStaticFiles()。)
在 ConfigureServices 中:
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。
答案2
感谢您的这篇文章,非常有帮助。
我收到此错误“位置 0 处的 JSON 中的意外令牌 <”iis 10 托管由核心 .net5 站点构建的 angular 11,使用 GLTFLoader 处理 .glb 文件。
Startup.cs 中的此代码修复了问题:
StaticFileOptions options = new StaticFileOptions { ContentTypeProvider = new FileExtensionContentTypeProvider() }; ((FileExtensionContentTypeProvider)options.ContentTypeProvider).Mappings.Add( new KeyValuePair<string, string>(".glb", "model/gltf-buffer")); app.UseStaticFiles(options);
此外,glb 文件必须放在 favicon.ico 所在的站点 /assets 文件夹中。而不是 /ClientApp/dist/assets
您的 angular.json 文件包含以下条目:“assets”:[“src/favicon.ico”,“src/assets”],
注意:设置站点 IIS mime 映射和/或处理程序映射在这里没有效果。
答案3
在 Startup.cs 文件中,更新 Configure 函数以包含以下代码
var options = new StaticFileOptions {
ContentTypeProvider = new FileExtensionContentTypeProvider()
};
((FileExtensionContentTypeProvider)options.ContentTypeProvider).Mappings.Add(
new KeyValuePair<string, string>(".obj", "text/plain"));
app.UseStaticFiles(options);