【问题标题】:sitemap.xml url returns 404 Errorsitemap.xml 网址返回 404 错误
【发布时间】:2013-12-11 22:04:37
【问题描述】:

我有一个大型联属网络营销网站,在 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" />

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

干杯, 斯蒂芬

【问题讨论】:

  • 最后我发现我编辑了错误的 web.config :(

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


【解决方案1】:

该路由不起作用的原因是默认情况下 .xml 由 IIS 中的“StaticFileHandler”处理,因此当请求进入 ASP.net 时不会被调用。

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

<modules runAllManagedModulesForAllRequests="true" />

它进入 system.webserver 节点。

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

【讨论】:

  • -> 是我尝试的第一件事,但没有改变任何东西。也试过: 也得到404
  • 最后我发现我编辑了错误的 web.config :(
【解决方案2】:

请按以下步骤操作:

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

2- 像这样将 sitemap.xml 的 MapRoute 放在其他 MapRoute 之上:

 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 检查 /sitemap.xml 与上面的 RouteMap ,然后抛出错误 404 没有匹配的控制器/动作。

【讨论】:

  • 我已经在这里和其他编程网站上搜索了每个主题,这些网站给了我一百万种不同的方法来做到这一点,但没有一个奏效。然而,这就像一种魅力,可能是很多人没有取得太大成功的原因,因为没有提出的解决方案提到这个事实
【解决方案3】:

我知道这是一个老话题,但我有一个比“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”前置条件,请使用&lt;modules&gt; 部分中的runAllManagedModulesForAllRequests 属性:

<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>

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多