Назад | Перейти на главную страницу

IIS отказывается обслуживать статические файлы .gltf

Я использую библиотека three.js с участием GLTFLoader.js. Я скачал бесплатную 3D модель с .gltf расширение (там же был .bin файл и папка с текстурами).

Я могу получить доступ к любому другому файлу в этой папке из IIS (10) как к статическому содержимому, за исключением файла .gltf, который возвращает страницу 404.

На этом этапе я добавил отображение MIME в IIS повсюду (web.config для сайта ASP.NET Core 2.2, верхний уровень IIS, уровень сайта IIS). Это модель / gltf + json. На всякий случай попробовал application / json и application / octet-stream. Он возвращает 404 во всех ситуациях.

Я попытался разрешить серверу обслуживать все статические файлы с помощью сопоставления MIME с подстановочными знаками. Даже это не удается.

Если я переименую файл .gltf в .json, он будет работать нормально.

Я попробовал FailedRequestTracing, который предоставил мне огромный файл xml. Пройдя через это, я ничего не понял, но, возможно, я просто недостаточно знаю о внутренней работе IIS.

Такая же проблема с IISExpress (запущена из Visual Studio 2019).

Я попытался преобразовать .gltf в .glb, используя https://glb-packer.glitch.me/ но расширение .glb демонстрирует ту же проблему с IIS -> 404.

Перезапуск IIS с помощью iisreset /restart не помогло.

Я не использую правила перезаписи URL.

Добавление опции ServeUnknownFileTypes = true для промежуточного программного обеспечения StaticFiles не имело никакого значения.

Вы сталкивались с подобной проблемой раньше? Есть предложения, что попробовать дальше?

ОБНОВЛЕНИЕ: мне удалось сузить проблему до обработчика AspNetCoreModuleV2. Если отсутствует, файл .gltf обслуживается правильно. Теперь мне действительно нужен этот модуль для запуска, так что это проблема.

ОБНОВЛЕНИЕ: наконец-то разобрался ... Я отправлю ответ следующей несчастной душе, которая наткнется на это.

Оказалось, что я использую собственный FileServerProvider, потому что мне нужен контейнер IoC, чтобы позже внедрить его в некоторые контроллеры. (Аналогичное исправление работает с UseStaticFiles () в методе Configure, если .gltf находится в wwwroot.)

В 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.

В файле 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);