【问题标题】:Static File Routes in ASP.NET MVCASP.NET MVC 中的静态文件路由
【发布时间】:2014-02-21 12:10:00
【问题描述】:

我正在开发一个 ASP.NET MVC 应用程序。在这个应用程序中,我需要在请求时动态生成站点地图。我一般都知道如何配置路由。但是,我不确定是否可以为特定文件创建路由。目前,我在 RouteConfig.cs 中有以下内容:

routes.MapRoute(
  name: "Sitemap",
  url: "resources/sitemap.xml",
  defaults: new { controller = "Site", action = "Sitemap" }
);

在我的 SiteController 中,我有以下内容:

public ActionResult Sitemap()
{
  // I will build my sitemap.xml file here and return it.
}

当我在浏览器的地址栏中输入 /resources/sitmap.xml 时,我注意到我的 Sitemap() 操作永远不会被触发。甚至可以在 ASP.NET MVC 中为特定文件设置路由吗?如果有,怎么做?

谢谢,

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    所以你必须做一些步骤 -

    第 1 步 - 映射 xml 扩展以由 .Net 处理以进行路由 在 <system.webServer> 下的 Web.config 中添加以下部分 -

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

    第 2 步 - 定义路由并覆盖与现有文件匹配的请求。

    routes.RouteExistingFiles = true;
    
    routes.MapRoute(
       name: "Sitemap",
       url: "{site}.xml",
       defaults: new { controller = "Site", action = "Sitemap", site = UrlParameter.Optional }
     );
    

    然后第三步 - 尝试访问/SiteMap.xml,你会得到控制器动作命中。

    【讨论】:

    • 我发现路由到 /sitemap 获取不存在的 sitemap.xml 文件,我不需要添加 routes.RouteExistingFiles = true; 行,还可以设置 HtmlFileHandler path 属性到 'sitemap.xml' 而不是 *.xml。不确定这是否会有很大的优势,但只是想我提到它。不过感谢您的回答,v 很有用。