2013-12-11 3 views
2

У меня есть большой сайт аффилированного маркетинга с миллионами продуктов, размещенных на Windows Azure. Для SEO я должен предоставить файл sitemap.xml, который динамически создается.sitemap.xml url возвращает 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 - Not Found

Когда я изменяю "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 обрабатывается «StaticFileHandler» в IIS так, когда приходит запрос в ASP.net не вызывается.

Вариант 1: Включить runAllManagedModulesForAllRequests - в вашем веб .config добавить следующее

<modules runAllManagedModulesForAllRequests="true" /> 

Он идет внутри узла system.webServer.

вариант 2: Добавить сопоставление для .xml в IIS и принудительное расширение этого файла в конвейере ASP.net. См here

+0

<модули runAllManagedModulesForAllRequests = «истинный» /> -> была первая вещь, которую я пытался, но ничего не изменилось Также пробовал:. <добавить имя = "AdfsMe tadata» путь = "sitemap.xml" глагол = "GET" тип = "System.Web.Handlers.TransferRequestHandler" Precondition = "integratedMode, runtimeVersionv4.0"/> Кроме того, получить 404 – stefan

+0

Наконец-то я понял, что я отредактировал неправильный web.config :( – stefan

1

Пожалуйста, выполните следующие действия:

1- Удалить sitemap.xml из корня каталога сайта (если есть)

2- Поместить MapRoute для sitemap.xml над другим MapRoutes так:

Причина ошибки в том, что карта сайта RouteMap находится под другими правилами, MVC проверяет /sitemap.xml с выше RouteMap, а затем выдает ошибку 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). См. «How to Take Advantage of IIS Integrated Pipeline» для примера включения модулей ASP.NET для всего содержимого.

Вы также можете использовать ярлык, чтобы все управляемые (ASP.NET) модули запускались для всех запросов в вашем приложении, независимо от предварительного условия «managedHandler».

Чтобы включить все управляемые модули для запуска для всех запросов, не настраивая каждый элемент модуля для удаления «managedHandler» предварительное условие, используйте runAllManagedModulesForAllRequests свойство в <modules> разделе:

<modules runAllManagedModulesForAllRequests="true" />  

При использовании этого свойства , предварительное условие «managedHandler» не действует, и все управляемые модули запускаются для всех запросов.

Вы можете узнать больше из его оригинальной темы: runAllManagedModulesForAllRequests=“true” Meaning

Таким образом, лучший способ установить обработчик HTTP для .XML URL на MVC является следующее:

<system.webServer> 
     <handlers> 
      <add name="Sitemap" path="sitemap.xml" type="System.Web.UI.PageHandlerFactory" verb="*" /> 
     </handlers> 
    </system.webServer> 
Смежные вопросы