ASP.NET Маршрут MVC со значениями перед контроллером и без завершающей косой черты

#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.