13

我正在使用 MVC4,需要将这样的请求路由到控制器:

[myapp]/data/fileinfo.xml

这是我配置的路线:

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

现在,如果 URL 不包含 .xml 扩展名,这工作得非常好,并将请求路由到我的 DataController,但是一旦使用扩展名,IIS 就会尝试提供一个静态文件(而不是路由到我的控制器),我得到一个 404 错误。

我已经在网上阅读了大量关于这个问题的问题/答案,但我尝试过的每个解决方案都失败了。

例如,我RouteExistingFiles = true在配置我的RouteCollection时尝试过使用,并且我<modules runAllManagedModulesForAllRequests="true" />在web.config中添加了,但无济于事。

如果有人知道我应该尝试什么或我可能缺少什么,将不胜感激。我正在使用 asp.Net 4.5、VS 2012 和 IIS 8.0。

4

2 回答 2

11

您可以在以下部分将其添加到您的 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 中没问题)。更多信息在这里。这也会对性能产生影响,因为每个请求都将通过托管管道进行路由。

高温高压

于 2013-06-03T08:25:27.373 回答
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 中缺少这些。

于 2013-09-09T15:13:42.333 回答