在MVC4中使用扩展名路由URL将无法正常工作,尝试提供静态文件

时间:2013-06-02 18:47:26

标签: asp.net-mvc iis static asp.net-mvc-routing

我正在使用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。

2 个答案:

答案 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中缺失。