Как обрабатывать кодирование URL в httplistenerrequest?
-
10-10-2019 - |
Вопрос
Я строю простой сервер, который использует HttpListener
для обработки запросов. Параметры строки запроса, которые я отправляю ему, при необходимости кодируются URL. Например, отправить строку кандзи "尺八"
, кодирование "%E5%B0%BA%E5%85%AB"
.
Мой образец URL, тогда "/?q=%E5%B0%BA%E5%85%AB"
.
В моем контекстном обратном вызове у меня есть:
HttpListenerContext context = Listener.EndGetContext();
string rawUrl = context.Request.RawUrl;
string query = context.Request.QueryString["q"];
Проверка результатов, я получаю:
rawUrl = "/?q=%E5%B0%BA%E5%85%AB"
query = "尺八"
Но если я посмотрю на context.Request.Url
, Я получил {http://localhost:8080/?q=尺八}
.
Похоже на строку запроса в context.Request.QueryString
декодируется с использованием некоторых кодировков, кроме UTF-8.
Мой обходной путь - игнорировать context.Request.QueryString
И создай свой собственный, сделав это:
var queryString = HttpUtility.ParseQueryString(context.Request.Url.Query);
Это дает мне правильную ценность, но это кажется чем -то вроде взлома.
Есть ли способ сказать HttpListener
(или контекст, или запрос), чтобы интерпретировать строку запроса как UTF-8, что, я думаю, в любом случае является стандартом? Или я должен просто жить с этим обходным пути?
Решение
Глядя на код, он полагается на то, что контенткодирование установлено в UTF8. Вот Снайпит из свойства QueryString httplistenerrequest:
public NameValueCollection QueryString
{
get
{
NameValueCollection nvc = new NameValueCollection();
Helpers.FillFromString(nvc, this.Url.Query, true, this.ContentEncoding);
return nvc;
}
}
Поскольку нет никакого способа изменить свойство ContentEcoding, которую вы застряли с помощью вашего «взлома». В любом случае, я думаю, что вы используете Httputility. Ppar sechroberyString, вероятно, служит вам лучше всего.
Другие советы
Пытаться System.Web.HttpUtility
string query = "d=bla bla bla";
string encoded = System.Web.HttpUtility.UrlEncode( query, System.Text.Encoding.UTF8 );
Учить больше https://msdn.microsoft.com/en-us/library/system.web.httputility(v=vs.110).aspx