Двоеточие в кодировке URL разрешается в 400 неверных запросах
Почему этот URL-адрес разрешается в 400 - Bad Request?
HTTP: // локальный: 2785 / API / тикер / Web.App.QuotesReaders / поиск = се% 3Aabb
Моя среда - Visual Studio 2010, MVC 4, а используемый контроллер - WebApiController.
% 3A является двоеточием в кодировке URL.
РЕШЕНИЕ
Это работает по какой-то причине:
HTTP: // локальный: 2785 / API / тикер = имя класса Web.App.QuotesReaders и поиск = се% 3Aabb
... что означает, что я не мог указать этот маршрут в global.asax.cs:
/api/ticker/{className}/{search}
... ни это...
/api/ticker/{className}/search={search}
... но это...
/api/ticker
Для получения дополнительной информации: http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx
1 ответ
Похоже, что ASP.net не разрешает двоеточия до "?" в URL, даже если он закодирован как%3A.
Например, они не будут работать
http://foo.org/api/persons/foo:bar http://foo.org/api/persons/foo%3Abar
Но это работает: http://foo.org/api/persons?id=foo%3Abar
Во всех примерах мы ожидаем, что ASP.NET MVC передаст "foo:bar" в качестве аргумента id, правильно декодированного. Я только что проверил это с MVC4, и это похоже на работу. Досадно, что он не принимает кодировку URL до вопросительного знака, но я уверен, что для этого есть веская причина. Вероятно, чтобы все оставалось до вопросительного знака, действительный URL и любые аргументы после вопросительного знака.