我正在使用MVC4并且需要将这样的请求路由到控制器:
[myapp]/data/fileinfo.xml
这是我配置的路线:
routes.MapRoute(
name: "Data",
url: "Data/{file}",
defaults: new { controller = "Data", action = "fileinfo"}
);
现在,如果URL不包含.xml扩展名,这可以很好地将请求路由到我的DataController,但是只要使用扩展名, IIS就会尝试提供静态文件 (而不是路由到我的控制器),我得到404错误。
我已经在线阅读了大量有关此问题的问题/答案,而且我尝试过的每个解决方案都失败了。
例如,我在配置RouteCollection时尝试使用RouteExistingFiles = true
,并在web.config中添加了<modules runAllManagedModulesForAllRequests="true" />
,但无济于事。
如果有人知道我应该尝试什么或者我可能会缺少什么,那将非常感激。我正在使用asp.Net 4.5,VS 2012和IIS 8.0。
答案 0 :(得分:11)
您可以将其添加到<system.webServer><handlers>
部分中的web.config:
<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中没问题)。更多信息here。由于每个请求都将通过托管管道进行路由,因此对此产生性能影响。
HTH
答案 1 :(得分:0)
我遇到了与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中缺失。