sitemap.xml url返回404错误

时间:2013-12-11 22:04:37

标签: asp.net-mvc asp.net-mvc-4

我有一个大型联盟营销网站,在Windows Azure上托管了数百万种产品。 对于SEO,我必须提供一个动态创建的sitemap.xml。

  public ActionResult SiteMap()
    {
        string sitemapUrl = "https://trendley.blob.core.windows.net/sitemap/sitemap.xml";

        byte[] bImage = null;
        using (WebClient wc = new WebClient())
        {
            bImage = wc.DownloadData(sitemapUrl);
        }
        return File(bImage, "application/octet-stream");
    }

我将以下路线添加到我的RouteConfig:

   routes.MapRoute("Sitemap",
"sitemap.xml",
new { controller = "Home", action = "Sitemap" });

不幸的是,这不起作用。 我得到了 - > HTTP错误404.0 - 未找到

当我将“sitemap.xml”更改为sitemapxml(删除扩展名)时,将调用我的控制器方法。 已经做了一些研究并使用我的web.config进行了播放,但似乎没有任何效果。

我尝试的第一件事就是添加:

<modules runAllManagedModulesForAllRequests="true" />

第二件事:

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

有人能告诉我如何完成这个。 我是否必须为此编写自己的处理程序?

干杯, 斯蒂芬

3 个答案:

答案 0 :(得分:4)

该路由不起作用的原因是因为默认情况下.xml由IIS中的“StaticFileHandler”处理,所以当ASP.net中的请求没有被调用时。

选项1:启用runAllManagedModulesForAllRequests - 在您的web .config中添加以下内容

<modules runAllManagedModulesForAllRequests="true" />

它进入system.webserver节点。

选项2:将.xml的映射添加到IIS并强制将该文件扩展名放入ASP.net管道。见here

答案 1 :(得分:1)

请按以下步骤操作:

1-从网站目录的根目录(如果存在)删除sitemap.xml

2-将mapmap的MapRoute放在其他MapRoutes上,如下所示:

 public static void RegisterRoutes(RouteCollection routes)
         {
             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

             routes.MapRoute(
             "Sitemap",
             "sitemap.xml",
              new { controller = "Home", action = "Sitemap" }
             );

             routes.MapRoute(
                 name: "Default",
                 url: "{controller}/{action}/{id}",
                 defaults: new { controller = "Home", action = "Index", id =      UrlParameter.Optional }
                 );

    }

错误的原因是当站点地图RouteMap在其他规则下时,MVC使用上面的RouteMap检查/sitemap.xml,然后抛出错误404,没有匹配的控制器/操作。

答案 2 :(得分:1)

我知道这是一个老话题,但我的解决方案比“runAllManagedModulesForAllRequests”更好。

模块前提条件:

  

IIS核心引擎使用前置条件来确定何时启用特定模块。例如,性能原因可能确定您只想为也发送到托管处理程序的请求执行托管模块。以下示例(precondition="managedHandler")中的前提条件仅为表单身份验证模块启用也由托管处理程序处理的请求,例如对.aspx或.asmx文件的请求:

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="managedHandler" />
     

如果删除属性precondition="managedHandler",则表单身份验证也适用于托管处理程序不提供的内容,例如.html,.jpg,.doc,也适用于经典ASP(.asp)或PHP (.php)扩展。有关启用ASP.NET模块以针对所有内容运行的示例,请参阅“How to Take Advantage of IIS Integrated Pipeline”。

     

您还可以使用快捷方式为应用程序中的所有请求启用所有托管(ASP.NET)模块,而不管“managedHandler”前提条件如何。

     

要为所有请求启用所有托管模块而不配置每个模块条目以删除“managedHandler”前置条件,请使用runAllManagedModulesForAllRequests部分中的<modules>属性:

<modules runAllManagedModulesForAllRequests="true" />    
     

使用此属性时,“managedHandler”前置条件无效,所有托管模块都会针对所有请求运行。

您可以从原始主题中了解更多信息:runAllManagedModulesForAllRequests=“true” Meaning

因此,在MVC上为.XML url设置HTTP处理程序的更好方法如下:

    <system.webServer>
        <handlers>
            <add name="Sitemap" path="sitemap.xml" type="System.Web.UI.PageHandlerFactory" verb="*" />
        </handlers>
    </system.webServer>