带有文件扩展名的ASP.NET MVC路径

时间:2014-04-01 04:59:07

标签: asp.net-mvc asp.net-mvc-5 attributerouting

在使用基于属性的路由的ASP.NET MVC5中,我想处理带有文件扩展名的URL,例如

~/javascript/security.js

这是一个示例控制器操作方法:

    [Route("javascript/security.js")]
    public ActionResult AngularSecurityModule(string clientId)
    {
        return View(new
                    {
                        ClientId = clientId
                    });
    }

然而,这给了我一个HTTP 404 - Not Found。

我更喜欢不使用runAllManagedModulesForAllRequests(例如

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

)因为这会损害网络应用程序中其他静态文件的性能。

1 个答案:

答案 0 :(得分:2)

原来答案是我只需要为该URL注册正确的处理程序,即添加

<add name="JavascriptSecurityJs" path="javascript/security.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler"    
      preCondition="integratedMode,runtimeVersionv4.0" />

到我的system.webServer/handlers就行了。为了完整起见,system.webServer中的整个web.config块:

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="OPTIONSVerbHandler" />
    <remove name="TRACEVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="JavascriptSecurityJs" path="javascript/security.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

关于这一点的好处是IIS静态文件处理仍适用于所有静态文件。