ASP.NET MVC - 路由 - 具有文件扩展名的操作

Jak*_*sky 27 c# url file-extension asp.net-mvc-routing asp.net-mvc-3

有没有办法实现调用URL http://mywebsite/myarea/mycontroller/myaction.xml 这基本上"假"请求文件,但结果将是一个动作操作,将服务于动态创建的文件?

我试过这个:

context.MapRoute(
                "Xml_filename",
                "Xml/{controller}/{action}.xml"
            );
Run Code Online (Sandbox Code Playgroud)

但是只要URL中有filextension,路由就会失败并且表现就像我直接请求文件一样.

我怀疑这可能是因为使用扩展名更少的url处理程序.

<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" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何建议.

的Jakub

Ben*_*ter 29

您需要TransferRequestHandler将对XML文件的请求映射到web.config中.否则IIS将处理该请求.

Jon Galloway 在这里解释了如何做到这一点.

总之,您将此元素添加到web.config中的location/system.webServer/handlers:

<add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Run Code Online (Sandbox Code Playgroud)


Ric*_*ahl 9

问题是IIS将.xml文件作为静态文件处理,并且默认情况下不会通过MVC应用程序路由XML文件.IIS处理请求,您的MVC代码永远不会更改路由到此文件.有几种方法可以解决这个问题.

我找到了最简单的方法来处理这个问题,方法是使用IIS Rewrite模块将URL从静态文件URL重写为MVC路由:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Live Writer Manifest">
        <match url="*.xml"/>
        <action type="Rewrite" url="route/xmlfilehandler"/>
      </rule>
    </rules>
  </rewrite>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

确保安装了IIS重写模块(从Platform Installer单独安装).如果您已经在使用Rewrite处理程序,那么这是最有效的解决方案.

正如Ben Foster和Jon Galloway的帖子所指出的,您还可以根据TransferRequestHandler您想要路由的特定路径进行映射.为了紧凑,这里是您需要添加到web.config的内容:

<system.webServer>
  <handlers>
     <add name="Windows Live Writer Xml File Handler"
       path="wlwmanfest.xml"
       verb="GET" type="System.Web.Handlers.TransferRequestHandler"
       preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" 
     />
  </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用属性路由来处理.xml文件URL.例如:

[Route("blog/wlwmanifest.xml")]
public ActionResult LiveWriterManifest() {... }
Run Code Online (Sandbox Code Playgroud)

此博客文章中的更多信息:http: //weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application