ASP.NETMVC-路由-具有文件扩展名的操作是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

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

我试过这个:

context.MapRoute(
                "Xml_filename",
                "Xml/{controller}/{action}.xml"
            );

但是只要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" />
提问于
用户回答回答于

需要将XML文件的请求映射到TransferRequestHandlerweb.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" />
用户回答回答于

问题在于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>

确保安装了IIS重写模块(从平台安装程序单独安装)。如果已经在使用重写处理程序,这是最有效的解决方案。

正如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>

然后,可以使用Attribute Route来处理.xml文件的Url。例如:

[Route("blog/wlwmanifest.xml")]
public ActionResult LiveWriterManifest() {... }

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

扫码关注云+社区