2013-12-11 137 views
2

我有一个大的联盟营销网站与数以百万计的托管于Windows Azure的产品。 对于SEO我必须提供哪些是动态创建一个sitemap.xml的。sitemap.xml的网址返回404错误

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

我加入了follwoing路线我RouteConfig:

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

不幸的是这不是workting。 我得到 - >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" /> 

有人能告诉我如何acomplish这一点。 我必须为此编写自己的处理程序吗?

干杯, 斯特凡

+0

最后我想通出错,我编辑了错误的web.config :( – stefan

回答

4

的原因,这条路是行不通的,因为默认的.xml由IIS中的“StaticFileHandler”处理,因此,当请求到达ASP.net,则不会调用。

选项1:启用runAllManagedModulesForAllRequests - 在您的网页.CONFIG添加以下

<modules runAllManagedModulesForAllRequests="true" /> 

是不言而喻的system.webserver节点内。

选项2:添加一个映射.XML到IIS并强制该文件扩展到ASP.net管道。见here

+0

<模块runAllManagedModulesForAllRequests =“true”/> - >是我尝试的第一件事,但没有改变任何东西 也试过: 另外得到404 – stefan

+0

最后我想出我已经编辑了错误的web.config :( – stefan

1

请按照下列步骤操作:

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

2-把图路线为sitemap.xml的比其他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。

+0

我已经在这里和其他编程网站上真实地搜寻了关于此的每个主题,这些网站给了我一百万种不同的方式来做到这一点,但都没有工作。然而,这种方式很有魅力,可能很多人没有太大的成功,因为没有提出的解决方案提到这个事实 –

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

无论“managedHandler”的先决条件如何,您还可以使用快捷方式启用所有托管(ASP.NET)模块以运行应用程序中的所有请求。

为了使所有管理模块,用于所有请求,而配置每个模块条目删除“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>