Как обрабатывать кодирование URL в httplistenerrequest?

StackOverflow https://stackoverflow.com/questions/4674696

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top