Почему конечный %20 (допустимые данные в этом случае) убивает asp.net mvc routing
Возьмите следующее действие контроллера
public ActionResult NextBySURNAME(int id, string data)
{
//code to process the data and edit the id accoringly not written yet
return RedirectToAction("Edit", new { id = id });
}
если я назову его
/Mycontroller/NextBySURNAME/ 12/Smith %20Simon
тогда он отлично работает (в этом случае запись редактирования 12)
но
/Mycontroller/NextBySURNAME/12/20% Смит
дает мне 404
Теперь я знаю, что в некоторых случаях в моей проблемной области существенное значение имеет пробел в хвосте, поэтому я не просто хочу его обрезать. Итак, почему это нарушает мой маршрут?
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}/{data}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional, data=UrlParameter.Optional } // Parameter defaults
);
Ответы
Ответ 1
Итак, я сделал некоторую отладку маршрута и обнаружил, что маршруты, которые заканчиваются пробелом, даже не оценивались моим приложением MVC. Поэтому IIS должен плохо обрабатывать эти запросы.
Я добавил правило перезаписи в IIS 7.5, чтобы сопоставить конечные пробелы и переписать их как один и тот же URL-адрес без пробела. Я не удовлетворен этим решением, но не смог найти объяснения о том, почему IIS неправильно обрабатывает URL-адреса с завершающими пробелами.
Ответ 2
Я думаю, что способ, которым избегали символы, обрабатывается, изменен в .NEt 4.0, но я не пробовал это сам.
См. http://msdn.microsoft.com/en-us/library/system.uri.aspx.
Эндрюс отвечает на косую черту в URL-адресе
Также Как создать экземпляр Uri, обработанный с помощью GenericUriParserOptions.DontCompressPath
Это все только дикие предположения, но, возможно, это помогает.