Запрет C # из кодировки скобок в строке запроса - PullRequest
0 голосов
/ 12 декабря 2010

Мне нужно использовать службу, которая принимает параметр GET с именем "names []".

Например: GET <a href="http://example.com/name2id?names" rel="nofollow">http://example.com/name2id?names</a>[]=john

Когда я пытаюсь использовать это в C # с помощью WebClient, скобки кодируются в% 5B% 5D, чего не понимает служба. Когда я отправляю вышеупомянутое с помощью моего браузера (без кодировки), все работает нормально.

Вот пример, который не работает:

using (var client = new System.Net.WebClient())
{
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john"));
}

Контролируется скрипачом, вот запрос:

GET http://example.com/name2id?names%5B%5D=john HTTP/1.1
Host: example.com
Connection: Keep-Alive

Есть ли способ заставить фреймворк НЕ кодировать URL, или каким-либо другим способом обойти эту проблему?

P.S. Я не контролирую API, поэтому не могу это изменить.

UPDATE:

Это немного странно. Я нашел решение, изменив код C # на:

using (var client = new System.Net.WebClient())
{
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john", true));
}

Обратите внимание на логическое значение dontEscape в Uri. Это на самом деле не рекомендуется, но это работает? Кто-нибудь может объяснить это?

Ответы [ 5 ]

1 голос
/ 12 декабря 2010

Как я понимаю, RFC2396 [] не являются допустимыми символами в URI. Поэтому мне кажется, что ваш сервис ожидает неверный http-запрос.

query         = *uric
uric          = reserved | unreserved | escaped
unreserved    = alphanum | mark
mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
escaped       = "%" hex hex

http://www.ietf.org/rfc/rfc2396.txt

0 голосов
/ 12 декабря 2010

Как упомянуто CodeInChaos, URL недействителен согласно RFC2396.

Чтобы C # не экранировал недопустимые символы, может использоваться перегруженный метод URI:

new Uri("http://example.com/name2id?names[]=john", true)

Однако, этот метод устарел, но, видимо, он все еще работает.Я должен жить с появлением предупреждения:)

0 голосов
/ 12 декабря 2010

Вы должны просто иметь возможность передавать URI в виде строки

Так делают

 response = client.DownloadString("http://example.com/name2id?names[]=john");

Должно работать без кодирования URL.

Хотя не пробовал, поэтому я могу ошибаться.

0 голосов
/ 12 декабря 2010

Технически это правильно, чтобы URL кодировать [] в %5B%5D, поэтому проблема не в использовании [], а в том, что провайдер неправильно URL-адрес декодирует путь / строку запроса

http://www.albionresearch.com/misc/urlencode.php

0 голосов
/ 12 декабря 2010

Вы уверены, что закодированные символы - реальная проблема?

Символы правильно кодируются классом WebClient. Если служба не может обрабатывать символы, которые правильно закодированы, значит, служба не работает.

Если сервис сломан таким образом, и вы все равно должны его использовать, то вам нужно найти другой способ отправки запроса.

...