IIS 拒绝提供静态 .gltf 文件

IIS 拒绝提供静态 .gltf 文件

我在用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);

相关内容