Asp.net mvc MVC:如何将/sitemap.xml路由到ActionResult?
我有一个SitemapActionResult,它覆盖了ActionResult,并在点击时提供一个SEO sitemap.xml。到目前为止还不错 不过,我希望在Google访问/sitemap.xml时提供sitemap.xml。为此,我需要一条可以看到“sitemap.xml”并指向/Home/sitemap的路径 如何创建此映射(在Routes表中)?为以下内容添加映射:Asp.net mvc MVC:如何将/sitemap.xml路由到ActionResult?,asp.net-mvc,seo,sitemap,sitemap.xml,Asp.net Mvc,Seo,Sitemap,Sitemap.xml,我有一个SitemapActionResult,它覆盖了ActionResult,并在点击时提供一个SEO sitemap.xml。到目前为止还不错 不过,我希望在Google访问/sitemap.xml时提供sitemap.xml。为此,我需要一条可以看到“sitemap.xml”并指向/Home/sitemap的路径 如何创建此映射(在Routes表中)?为以下内容添加映射: routes.MapRoute( "Sitemap", "sitem
routes.MapRoute(
"Sitemap",
"sitemap.xml",
new { controller = "Home", action = "SiteMap" }
);
请注意,路由、控制器和操作选项是硬编码的。您可以使用此选项
第1步。将文件扩展名映射到TransferRequestHandler
IIS 7集成模式使用HTTP处理程序映射,将路径/动词组合指向HTTP处理程序。例如,有一个默认的处理程序映射,它将path=“*.axd”verb=“GET,HEAD,POST,DEBUG”指向该站点运行的.NET运行时版本的相应ISAPI模块。查看IIS Express下默认处理程序的最简单方法是在IIS Express下运行站点,右键单击系统托盘中的IIS Express图标,单击“显示所有应用程序”,然后单击站点。底部的applicationhost.config链接已链接,因此您只需单击它,就可以在Visual Studio中加载它
如果滚动到底部,您将看到path=“*”verb=“*”
有一个catchall StaticFile映射,指向StaticFileModule、DefaultDocumentModule、DirectoryListingModule
。如果您什么也不做,这就是处理.html请求的方法。因此,第一步是在web.config中添加一个处理程序,将*.html
请求指向TransferRequestHandler
TransferRequestHandler
是处理MVC路由中常见的无扩展URL的处理程序,例如/store/details/5
添加处理程序映射非常简单-只需打开web.config并将其添加到
节点
<add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
第3步。路由现有文件
这几乎涵盖了它,但还有一件事需要注意——覆盖与现有文件匹配的请求。如果您有一个名为myfile.html的实际文件,路由系统将不允许您的路由运行。我忘记了这一点,最后出现了HTTP 500错误(递归溢出),不得不向Eilon Lipton寻求帮助
无论如何,这很容易修复-只需将routes.RouteExistingFiles=true添加到路线注册中即可。我完成的RegisterRoutes调用如下所示:
routes.MapRoute(
name: "XMLPath",
url: "sitemapindex.xml",
defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
);
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.RouteExistingFiles = true;
routes.MapRoute(
name: "CrazyPants",
url: "{page}.html",
defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
就这样
我通过添加以下控制器操作进行了测试:
public FileResult Html()
{
var stringBuilder = new StringBuilder();
stringBuilder.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
stringBuilder.AppendLine("<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");
stringBuilder.AppendLine("<sitemap>");
stringBuilder.AppendLine("<loc>http://sprint-newhomes.move.com/sitemaps/sitemap_01.xml</loc>");
stringBuilder.AppendLine("<lastmod>" + DateTime.Now.ToString("MMMM-dd-yyyy HH:mm:ss tt") + "</lastmod>");
stringBuilder.AppendLine("</sitemap>");
stringBuilder.AppendLine("<sitemap>");
stringBuilder.AppendLine("<loc>http://sprint-newhomes.move.com/sitemaps/sitemap_02.xml</loc>");
stringBuilder.AppendLine("<lastmod>" + DateTime.Now.ToString("MMMM-dd-yyyy HH:mm:ss tt") + "</lastmod>");
stringBuilder.AppendLine("</sitemap>");
stringBuilder.AppendLine("</sitemapindex>");
var ms = new MemoryStream(Encoding.ASCII.GetBytes(stringBuilder.ToString()));
Response.AppendHeader("Content-Disposition", "inline;filename=sitemapindex.xml");
return new FileStreamResult(ms, "text/xml");
}
public FileResult Html()
{
var stringBuilder=新的stringBuilder();
stringBuilder.AppendLine(“”);
stringBuilder.AppendLine(“”);
stringBuilder.AppendLine(“”);
stringBuilder.AppendLine(“http://sprint-newhomes.move.com/sitemaps/sitemap_01.xml");
stringBuilder.AppendLine(“+DateTime.Now.ToString”(“mm-dd-yyyy-HH:mm:ss-tt”)+”;
stringBuilder.AppendLine(“”);
stringBuilder.AppendLine(“”);
stringBuilder.AppendLine(“http://sprint-newhomes.move.com/sitemaps/sitemap_02.xml");
stringBuilder.AppendLine(“+DateTime.Now.ToString”(“mm-dd-yyyy-HH:mm:ss-tt”)+”;
stringBuilder.AppendLine(“”);
stringBuilder.AppendLine(“”);
var ms=newmemoryStream(Encoding.ASCII.GetBytes(stringBuilder.ToString());
AppendHeader(“内容处置”,“内联;文件名=sitemapindex.xml”);
返回新的FileStreamResult(ms,“text/xml”);
}
要使其正常工作,您需要做两件事:
routes.MapRoute(
名称:“网站地图”,
url:“sitemap.xml”,
默认值:新建{controller=“YourControllerName”,action=“YourControllerName”}
);
我今天早些时候确实尝试过这个方法,但由于我在默认路线之后添加了路线,所以无法使其工作。需要将其插入到默认工作路线之前。谢谢。还请记住在system.webServer中为您的模块配置添加runAllManagedModulesForAllRequests=“true”,否则它将尝试使用staticfile处理程序,并返回404@RaulVejar非常感谢。我在互联网上搜索了一个多小时,你是第一个提到这个模块的人。它解决了我的问题。runAllManagedModulesForAllRequest将影响您的性能。也许您可以在system.webServer.modules中添加一个enry for sitemap.xml:@RaduD它应该放在system.webServer.handlers中,而不是.modules中。虽然这个答案可能是正确的,但最好在这里包含相关代码。如果网站移动或删除,仅链接的答案可能会变得不正确。此答案也非常有用,但它位于底部