#c# #asp.net #asp.net-mvc #asp.net-mvc-routing #asp.net-mvc-5
#asp.net-mvc #asp.net-mvc-4 #asp.net-mvc-routing
Вопрос:
Вероятно, это простой вопрос, но я просто не могу заставить его работать.
У меня этот маршрут указан в моем RouteConfig
routes.MapRoute(
name: "DefaultSiteRoute",
url: "{accountid}/{hostname}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, accountid = UrlParameter.Optional, hostname = UrlParameter.Optional }
);
И он отлично работает для такого URL-адреса
/123456/www.test.com/
или это
/123456/www.test.com/Controller/Action
но он не может справиться с этим
/123456/www.test.com
Я получаю IIS 404
Что более странно, так это то, что если я вызываю Url.Action
этот маршрут с помощью контроллера и действия по умолчанию (т. Е. Home / Index), он создает URL-адрес без конечной косой черты, который он затем не распознает. Мне действительно нужно, чтобы он работал с косой чертой и без нее.
Комментарии:
1. Вам нужна завершающая косая черта во всех ссылках?
2. Мне это не нужно , но, учитывая, что
Url.Action
метод генерирует ссылку без косой черты, это будет проблемой3. Что произойдет, если вы сделаете параметр {action} необязательным?
4. @CodeART присвоение ему значения по умолчанию (
Index
) уже должно сделать его «необязательным».5. @HenkMollema это правильно, все параметры в этом маршруте являются необязательными, но у 2 указаны значения по умолчанию
Ответ №1:
Проблема в том ASP.net 4.0 не перенаправляет URL-адреса, которые заканчиваются расширением, в MVC. Они делают это для ускорения запросов к статическим файлам. Смотрите эту ссылку
Что вы можете сделать:
1) Настройте UrlRoutingModule для маршрутизации всех управляемых и неуправляемых запросов (по умолчанию используется только маршрутизация управляемых запросов).
Недостаток: может негативно сказаться на производительности.
<system.webServer> <modules> <remove name ="UrlRoutingModule-4.0"/> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="runtimeVersionv4.0" /> </modules> <system.webServer>
2) Настройте для обработки расширений .com, .net. org и т. Д.
Недостаток: похоже на взлом.
<system.webServer> <handlers> <add name="UrlRoutingHandler" type="System.Web.Routing.UrlRoutingHandler, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" path="*.com" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"/>
Комментарии:
1. Вариант 1 отлично работает с одним небольшим дополнением, которое вам нужно добавить
runAllManagedModulesForAllRequests="true"
в тег modules . в противном случае, это все. Я совершенно забыл, что он будет интерпретировать .com как расширение, хороший звонок!2. Вариант 1 без установки для runAllManagedModulesForAllRequests значения true работает в IIS Express. Однако не тестировался с IIS.