2013-06-10 3 views
1

У меня возникло очень странное поведение в ASP.NET MVC3. В основном я написал HttpModule, который запускает BeginRequest, который потенциально перезаписывает мой URL-адрес, используя HttpContext.RewritePath(string). В большинстве случаев это работает правильно, но я заметил, что когда у меня есть место в моем URL-адресе, ASP.NET MVC ведет себя по-разному при перезаписи.MVC3 Пользовательский URL-адрес Rewriter HttpModule RouteData corporation

Пример URL:

http://www.mysite.com/my%20url 

Мой ReWriter устанавливается с Regex, подобно Геликона, где он может захватить группу и использовать эту захваченную группу в переписывании. Пример правило:

<add original="^/(.*)\?test$" rewritten="/$1" /> 

Это переписать URL, такие как http://www.mysite.com/my%20url?test < к http://www.mysite.com/my%20url - обратите внимание, что строки запроса уходит. Это работает правильно.

И моя маршрутизация MVC настроена на захват части my%20url с помощью подстановочного знака, чтобы сопоставить его с значением RouteData под ключом «navstate». Правило выглядит следующим образом:

"{*navstate}" 

Так что, когда я не переписать, мой RouteDataDictionary содержит:

key: "navstate" value: "my url" 

Когда я DO переписать, мой RouteDataDictionary содержит:

key: "navstate" value: "my%20url" 

Обратите внимание, что это не URL-адрес Декодирование переменной RouteData.

У кого-нибудь есть идеи по этому поводу? Единственное, что, кажется, имеет значение, это использование HttpContext.RewritePath(string) в моем HttpModule ... Отключение модуля обеспечивает правильную функциональность. Ручное декодирование URL-адреса перед вызовом перезаписи с использованием HttpUtility.UrlDecode(string) также заставляет его работать ... но чувствует себя взломанным.

EDIT:

Это, кажется, ошибка не с MVC, но с ASP.NET маршрутизации, поэтому я обновил теги как таковой.

ответ

2

Я проверил это, и это, как я думал. Перенаправление URL и маршрутизация не были предназначены для совместного использования по одному и тому же запросу. Подумайте о маршрутизации как особой форме перезаписи URL-адресов, так что они вмешиваются друг в друга.

Я знаю, что это похоже на ошибку, потому что она не работает так, как вы ожидали, но она работает точно так, как она должна. Подумайте о конвейере и о том, когда ваши модули попали туда, и работа, которую уже сделал модуль маршрутизации. Все должно происходить в порядке, поэтому происходит декодирование, происходит переписывание URL-адресов и т. Д.

+0

Справедливо. Имеет смысл, что если декодирование произошло раньше моего события BeginRequest, мне нужно было бы повторно декодировать мой переписанный URL. Спасибо Скотту - я очень ценю исследования и последующие действия. Стоит ли заставлять декодировать назначение RouteDataDictionary в будущей сборке сборки маршрутизации? – Haney