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:<add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
为了清楚起见,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 核心 Web 应用程序:在开发中,服务器首先检查 mvc 路由,但在生产中服务器仅返回 index.html
ASP.NET MVC 路由 - 将入站路由值自动传递给出站 URL?