Url с расширением, которое не обрабатывается маршрутизацией - программирование

Url с расширением, которое не обрабатывается маршрутизацией

Я использовал следующий для создания файла robots.txt в asp.net mvc3 для использования контроллера для обрабатывать ответ сервера, а служба IIS 8.0 express возвращает ошибку, не найденную в файле, а не ошибку asp.net.

Как мне заставить IIS не искать файл в этих случаях? Есть что-то, что мне нужно в web.config?

4b9b3361

Ответ 1

IIS пытается быть умным здесь. Он перехватывает точку в URL-адресе и считает, что это статический файл и пытается обслуживать его с помощью обработчика StaticFile по умолчанию. это событие dopesn't попадает в управляемое приложение ASP.NET.

Первая возможность заключается в добавлении следующего в ваш web.config

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true" />

но на самом деле это не то, что я бы рекомендовал вам делать, потому что это может негативно повлиять на производительность вашего приложения, потому что теперь все запросы к статическим файлам (например,.js,.css, images,...) будут через управляемый трубопровод.

Рекомендуемый подход заключается в добавлении следующего обработчика в тэг web.config (<handlers> <system.webServer>):

<system.webServer>
    <handlers>
        <add name="Robots-ISAPI-Integrated-4.0" path="/robots.txt" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        ...
    </handlers>
</system.webServer>

Обратите внимание, как мы указали, что этот обработчик применим только к определенному URL-адресу и HTTP-глаголу.

Теперь, когда вы GET /robots.txt, IIS больше не будет обрабатывать его с помощью обработчика StaticFile, но вместо этого передаст его управляемому конвейеру ASP.NET. И затем он будет перехвачен движком маршрутизации и перенаправлен на соответствующее действие контроллера.

Ответ 2

Если вам не нужен динамически созданный файл robots.txt, который очень редко необходим, выполните следующие действия:

  • Игнорировать маршрут до robots.txt

    routes.IgnoreRoute( "robots.txt" );

  • Добавьте файл robots.txt в корневой каталог