Какова правильная кодировка для querystrings?

Я пытаюсь отправить запрос на 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/tvxe6rs?test=xe6

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

когда я посылаю запрос от моего asp.net приложение, использующее HttpWebRequest, URL-адрес кодируется следующим образом:

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

он кодирует строку запроса так же, как и часть пути url-адреса. Удаленная служба не понимает эту кодировку, поэтому я не получаю правильного ответа.

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

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

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

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

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

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

3 ответов


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

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

изменить:

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

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

это должно оставить международные символы только в пути.



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

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

для всех, кто интересуется здесь, это старый Firefox bugreport о проблеме:https://bugzilla.mozilla.org/show_bug.cgi?id=284474 (Спасибо @dtb)

Итак, кажется, нет хорошего решения.

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