Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC:如何将/sitemap.xml路由到ActionResult?_Asp.net Mvc_Seo_Sitemap_Sitemap.xml - Fatal编程技术网

Asp.net mvc MVC:如何将/sitemap.xml路由到ActionResult?

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

我有一个SitemapActionResult,它覆盖了ActionResult,并在点击时提供一个SEO sitemap.xml。到目前为止还不错

不过,我希望在Google访问/sitemap.xml时提供sitemap.xml。为此,我需要一条可以看到“sitemap.xml”并指向/Home/sitemap的路径

如何创建此映射(在Routes表中)?

为以下内容添加映射:

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”);
}

要使其正常工作,您需要做两件事:

  • 指示IIS允许静态文件请求“/sitemap.xml”击中您的控制器。否则,IIS将绕过您的应用程序,直接查找具有此名称的文件。将以下行添加到web.config:
  • 
    
  • 在MVC应用程序中放置一条与此请求和ActionResult相匹配的路由(确保将其放置在默认路由之前):
  • 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中。虽然这个答案可能是正确的,但最好在这里包含相关代码。如果网站移动或删除,仅链接的答案可能会变得不正确。此答案也非常有用,但它位于底部