Какова правильная кодировка для 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)
Итак, кажется, нет хорошего решения.
спасибо всем, кто помог, хотя!