Двоеточие в кодировке 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 и любые аргументы после вопросительного знака.

Другие вопросы по тегам