2012-02-17 3 views
15

Я довольно новичок в MVC и Routing, и мне было предложено изменить приложение, чтобы использовать разные URL-адреса. задача, которая немного над мной, так как у меня нет опыта.ASP.NET MVC Routing - добавление расширения .html к маршрутам

хорошо, давайте поговорим немного кода:

routes.MapRoute(
"CategoryBySeName", // Route name 
"products/{SeName}", // URL with parameters 
new { controller = "Catalog", action = "CategoryBySeName" } 
); 

это работает, как ожидалось, но клиент хочет «.html» в конце пути, так что я изменил:

"products/{SeName}", // URL with parameters 

к:

"products/{SeName}.html", // URL with parameters 

, который выходит из строя (IIS 404 страницы - MapRequestHandler) похоже СИИС сделает g, чтобы загрузить физический файл с этим именем вместо передачи его в приложение.

Похожие: ASP.NET MVC Routing to start at html page (не ответил, не дублировать)

+1

Включите отладчик маршрута и посмотрите, что на самом деле происходит. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx –

ответ

3

Изменение пула приложений от Classic до Integrated устраняет проблему. спасибо, парень за вашу помощь.

10

Вы догадаться, что обработчик IIS, вероятно, захватывая запрос до MVC, вероятно, правильно.

Предполагая, что IIS 7: http://technet.microsoft.com/en-us/library/cc770990(v=ws.10).aspx

Вам нужно отредактировать .html обработчик в IIS для использования ASP.NET.

Вы можете найти его в свойствах веб-сайта на вкладке домашнего каталога в конфигурации приложения в разделе сопоставлений в разделе II6.

Что-то вроде строк (версия может быть разной): C: \ windows \ microsoft.net \ framework \ v4.0.30319 \ aspnet_isapi.dll - это то, что вам нужно для обработки файлов .html.

+2

'' добавил это в мой web.config , проблема все еще существует. – Dementic

+0

Я не уверен в возможности сделать это без доступа к IIS. Мое понимание (которое может быть неправильным) заключается в том, что IIS определяет, куда отправить запрос на основе сопоставлений, и обработчики не могут переопределить другие обработчики при нормальных обстоятельствах. –

+5

для тех, кому необходимо исправить это в IIS Express, также при отладке найдите значок IIS Express в системном трее, «Показать все приложения», выберите свое приложение и нажмите ссылку на источник конфигурации, затем добавьте строку для «\ * .html "зеркалирование всех строк" \ * .cshtml "в узлах location/system.webServer/handlers внизу. –

3

Просто добавьте этот раздел в Web.config, и все запросы к маршруту/{* pathInfo} будут обрабатываться указанным обработчиком, даже если в pathInfo есть точки. (Взято из ServiceStack MVC примера Хост Web.config и этот ответ https://stackoverflow.com/a/12151501/801189)

<location path="route"> 
    <system.web> 
     <httpHandlers> 
     <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" /> 
     </httpHandlers> 
    </system.web> 
    <!-- Required for IIS 7.0 --> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <handlers> 
     <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" /> 
     </handlers> 
    </system.webServer> 
    </location> 
7

Вы должны заставить все запросы через трубопровод ASP.NET, и вы можете сделать это, добавив только эту одну строку в Интернете. config вашей заявки:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
+0

Это работало для моего приложения ASP.Net MVC 4, работающего в IIS Express – Jimbo