Подтвердить что ты не робот

Маршрутизация url с расширением в MVC4 не будет работать, пытается обслуживать статический файл

Я использую MVC4 и должен направить такой запрос контроллеру:

[myapp]/data/fileinfo.xml

Вот маршрут, который я настроил:

routes.MapRoute(
            name: "Data",
            url: "Data/{file}",
            defaults: new { controller = "Data", action = "fileinfo"}
        );

Теперь это прекрасно работает и направляет запросы моему DataController, если URL-адрес не включает расширение .xml, но как только используется расширение, IIS пытается обслуживать статический файл (вместо маршрутизации на мой контроллер), и я получаю ошибку 404.

Я прочитал множество вопросов/ответов об этой проблеме в Интернете, и каждое исправленное мной решение потерпело неудачу.

Например, я попытался использовать RouteExistingFiles = true при настройке моего RouteCollection, и я добавил <modules runAllManagedModulesForAllRequests="true" /> в web.config, но безрезультатно.

Если у кого-то есть представление о том, что я должен попробовать или чего я могу пропустить, это было бы очень признательно. Я использую asp.Net 4.5, VS 2012 и IIS 8.0.

4b9b3361

Ответ 1

Вы можете добавить это в свой web.config в разделе <system.webServer><handlers>:

<add name="ManagedDllExtension" 
     path="data/fileinfo.xml" 
     verb="GET" type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

Ваш маршрут будет

routes.MapRoute(
        name: "Data",
        url: "Data/fileinfo.xml",
        defaults: new { controller = "Data", action = "fileinfo"}
    );

Существует также <modules runAllManagedModulesForAllRequests="true">, но, похоже, он не работает для MVC4/IIS8 (обычно это поддерживается в MVC3/IIS7 IIRC). Подробнее здесь. Это также влияет на производительность, поскольку каждый запрос будет проходить через управляемый конвейер.

НТН

Ответ 2

У меня была такая же проблема с ASP MVC 4. В разделе web.config syste.webserver.handlers я нашел следующий код:

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

Все запросы, которые имеют .ext, будут обрабатываться автоматически IIS. Они отсутствовали в MVC 3.