Как обрабатывать кодировку URL в HttpListenerRequest? - PullRequest
1 голос
/ 13 января 2011

Я создаю простой сервер, который использует 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, который я считаю стандартом в любом случае? Или я должен просто жить с этим обходным путем?

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Рассматривая код, он полагается на то, что ContentEncoding установлен в UTF8. Вот фрагмент кода свойства QueryString запроса HttpListenerRequest:

public NameValueCollection QueryString
{
    get
    {
        NameValueCollection nvc = new NameValueCollection();
        Helpers.FillFromString(nvc, this.Url.Query, true, this.ContentEncoding);
        return nvc;
    }
}

Так как нет способа изменить свойство ContentEncoding, вы застряли с помощью «хака». Во всяком случае, я думаю, что использование HttpUtility.ParseQueryString, вероятно, будет служить вам лучше всего.

0 голосов
/ 10 апреля 2018

Попробуйте 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

...