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

Posted

技术标签:

【中文标题】ASP.NET MVC - 路由 - 带有文件扩展名的操作【英文标题】:ASP.NET MVC - Routing - an action with file extension 【发布时间】:2014-04-05 05:57:25 【问题描述】:

有没有办法实现调用URLhttp://mywebsite/myarea/mycontroller/myaction.xml 这基本上会“伪造”请求文件,但结果将是一个动作操作,它将为动态创建的文件提供服务?

我试过这个:

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

但只要 URL 中有文件扩展名,路由就会失败,并且表现得就像我直接请求文件一样。

我怀疑这可能是因为使用了无扩展名的 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" />

感谢您的任何建议。

雅库布

【问题讨论】:

有没有办法在不手动配置 IIS 的情况下做到这一点?也许有一种 ASP NET 可以将 IIS 配置打包在一起的方法?, 【参考方案1】:

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

Jon Galloway 解释了如何做到这一点here。

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

<add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

【讨论】:

相关sn-p:&lt;add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /&gt; 为了清楚起见,Jon Galloway 的文章指导您向 RouteCollection 添加路由,但您可以单独使用属性路由,正如 Rick Strahl 在他的回答中所说的那样 链接有时会消失,请在答案中添加相关信息。 Rick Strahl 描述了一个类似的approach (adding a handler of type TransferRequestHandler) here(哎呀,我意识到 Rick Strahl 实际上发布了这个答案below!)【参考方案2】:

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

我找到了处理此问题的最简单方法,即使用 IIS 重写模块将 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 重写模块(与平台安装程序分开安装)。如果您已经在使用 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>

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

[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

【讨论】:

【参考方案3】:

如果您将 xml 文件放在网站内的某个文件夹中。 尝试这样的事情: C# - How to make a HTTP call

【讨论】:

您好,文件服务器上不存在该文件。我们在视图上动态提供 XML 输出。

以上是关于ASP.NET MVC - 路由 - 带有文件扩展名的操作的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 路由:绕过路径的静态文件处理程序

带有反应模板的 Asp.net 核心 Web 应用程序:在开发中,服务器首先检查 mvc 路由,但在生产中服务器仅返回 index.html

ASP.NET MVC 路由 - 将入站路由值自动传递给出站 URL?

带有 ASP.NET 路由的原始、未处理的 URL

具有固定 URI 的 ASP.NET 路由不映射查询字符串参数

ASP.NET MVC如何设置路由启动