Какая правильная кодировка для строк запроса? - PullRequest
8 голосов
/ 12 мая 2011

Я пытаюсь отправить запрос на URL-адрес, подобный этому "http://mysite.dk/tværs?test=æ", из приложения asp.net, и у меня возникают проблемы с корректным кодированием строки запроса. Или, возможно, строка запроса закодирована правильно, служба, которой я являюсьподключение к просто не понимает это правильно.

Я попытался отправить запрос в разные браузеры и записал, как они кодируют запрос с помощью Wireshark, и я получаю следующие результаты:

Firefox: http://mysite.dk/tv%C3%A6rs?test=%E6
Ie8:     http://mysite.dk/tv%C3%A6rs?test=\xe6
Curl:    http://mysite.dk/tv\xe6rs?test=\xe6

Firefox, IE и Curl получают правильные результаты от службы. Обратите внимание, что они по-разному кодируют датский специальный символ 'æ' в строке запроса.

Когда я отправляю запрос из моего приложения asp.net с помощью HttpWebRequestURL-адрес кодируется следующим образом:

http://mysite.dk/tv%C3%A6rs?test=%C3%A6

Кодирует строку запроса так же, как часть пути URL. Удаленная служба не понимает эту кодировку, поэтому я не получаю правильный ответ.

Для записи 'æ' (U + 00E6) - это% E6 в ISO-LATIN-1 и% C3% A6 в UTF-8.

I cЯ мог бы изменить удаленную службу, чтобы она принимала строку запроса в кодировке UTF-8, но тогда служба перестала бы работать в браузерах, и я не очень заинтересован в этом.Есть ли способ указать .NET, что он не должен кодировать строки запросов с помощью UTF-8?

Я создаю веб-запрос следующим образом:

var req = WebRequest.Create("http://mysite.dk/tværs?test=æ") as HttpWebRequest;

Но проблема, похоже, возниклаиз System.Uri, который очевидно используется внутри WebRequest.Create:

var uri = new Uri("http://mysite.dk/tværs?test=æ");
// now uri.AbsolutePath == "http://mysite.dk/tv%C3%A6rs?test=%C3%A6"

Ответы [ 3 ]

5 голосов
/ 12 мая 2011

Похоже, что вы применяете UrlEncode ко всему URL - это не правильно, пути и строки запросов кодируются по-разному, как вы видели. Что делает кодировка URI, WebRequest?

Вы можете вручную построить различные детали, используя UriBuilder , или вручную кодировать, используя UrlPathEncode для пути и UrlEncode для имен и значений строки запроса.

Edit:

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

<configuration>
  <uri>
      <iriParsing enabled="true" />
  </uri>
</configuration>

После этого интернациональные символы должны остаться в пути.

2 голосов
/ 12 мая 2011

Вы пробовали UrlEncode?

http://msdn.microsoft.com/en-us/library/zttxte6w.aspx

0 голосов
/ 25 мая 2011

В итоге я изменил свой удаленный веб-сервис, ожидая, что строка запроса будет в кодировке UTF-8. Это решает мою непосредственную проблему: веб-сервис не может быть правильно вызван как PHP, так и .NET Framework.

Однако теперь поведение в браузерах странное. Скопируйте и вставьте в браузер URL-адрес типа "http://mysite.dk/tv%C3%A6rs?test=%C3%A6"", а затем нажмите клавишу возврата, он даже исправит закодированные символы и отобразит местоположение как "http://mysite.dk/tværs?test=æ".. Если затем перезагрузить страницу (F5), он все равно будет работать. Но если я щелкну на строке адреса и снова нажму return, строка запроса закодируется с помощью символа latin-1 и завершится ошибкой.

Для всех, кто заинтересован, вот старый отчет об ошибке в Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=284474 (спасибо @dtb)

Так что, похоже, нет хорошего решения.

Спасибо всем, кто помог, хотя!

...