2013-12-11 167 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>