Маршрутизация 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.
Ответы
Ответ 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.