REST webservice "Плохой запрос" - PullRequest
2 голосов
/ 06 марта 2012

Я пишу веб-сервис REST с таким методом:

[WebGet(
    UriTemplate = "/Test/{p1}/{p2}",
    BodyStyle = WebMessageBodyStyle.Bare,
    ResponseFormat = WebMessageFormat.Xml)]
public string Test(string p1, string p2)
{
    // Do something here
}

Так что, если я вызываю basurl/Test/prova/test, мой метод Test вызывается с p1 = "prova" и p2 = "test" и все работает нормально.
Проблема возникает, когда я пытаюсь использовать параметр, имеющий (например) % char: даже перевод его в URL-код, когда я пытаюсь позвонить basurl/Test/prova/te%25st, я получаю
Errore HTTP 400 - неверный запрос.

Если я использую

[WebGet(
    UriTemplate = "/Test/{p1}?p2={p2}",
    BodyStyle = WebMessageBodyStyle.Bare,
    ResponseFormat = WebMessageFormat.Xml)]
public string Test(string p1, string p2)
{
    // Do something here
}

и звоню basurl/Test/prova?p2=te%25st, это работает.
Зачем?Что я могу сделать, чтобы первый синтаксис работал?

ОБНОВЛЕНИЕ:
Посмотрите на мой ответ с возможным решением.
Если кто-то найдет лучший вариант, пожалуйста, опубликуйте его!!
Спасибо

1 Ответ

1 голос
/ 06 марта 2012

Поглядывая вокруг Я только что нашел эту ссылку: http://weblogs.asp.net/imranbaloch/archive/2010/04/23/understanding-400-bad-request-exception.aspx, где они говорят:

ASP.NET Ограничения:

ПослеПередача ограничений, навязанных режимом ядра http.sys, затем запрос передается в IIS, а затем в механизм ASP.NET, а затем снова запрос должен передать некоторое ограничение из ASP.NET для его успешного завершения.

ASP.NET допускает только длину пути URL до 260 символов (только пути, например http://a/b/c/d, здесь путь от a до d).Это означает, что если у вас длинные пути, содержащие 261 символ, вы получите исключение Bad Request.Это связано с ограничением пути к файлу NTFS.

Другое ограничение заключается в том, какие символы можно использовать в части пути URL-адреса. Можно использовать любые символы, кроме некоторых символов, поскольку они называются недопустимыми символами в пути.Вот некоторые из этих недопустимых символов в части пути URL, <,>, *,%, &,:, \,? .Для подтверждения этого просто щелкните правой кнопкой мыши на обозревателе решений и добавьте новую папку и назовите этот файл для любого из вышеперечисленных символов, вы получите сообщение.Файлы или папки не могут быть пустыми строками и не содержать только «.»или иметь любой из следующих символов .....

Для проверки описанной выше ситуации я создал веб-приложение и поместил Default.aspx в папку% A (созданную из проводника Windows), затем перейдите к,http://localhost:1234/A%25A/Default.aspx, что я получаю ответ от сервера, это исключение Bad Request.Причина в том, что% 25 является символом%, который является недопустимым символом пути URL в ASP.NET.Однако вы можете использовать эти символы в строке запроса.

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

Итак, я начинаю думать, что мою проблему невозможно решить.
Я уверен, что эта проблема отсутствует в некоторых веб-сервисах REST, написанных на PHP и размещенных наApache, так что я думаю, что это просто ограничение безопасности IIS / ASP, я не могу найти обходной путь для ...

ОБНОВЛЕНИЕ С ЗАКЛЮЧИТЕЛЬНЫМ РЕШЕНИЕМ:
Я нашел решение здесь : прочитайте статью, чтобы понять все.
Вы должны знать, что это может быть рискованно, поэтому подумайте хорошо, прежде чем использовать его.

<system.web>
  <httpRuntime requestPathInvalidCharacters="" />
  <pages validateRequest="false" />
</system.web>
...