Domanda

Sto costruendo un server semplice che usi HttpListener alle richieste di processo. I parametri di stringa di query che invio ad esso sono URL codificato, se necessario. Ad esempio, per inviare la stringa "尺八" Kanji, la codifica è "%E5%B0%BA%E5%85%AB".

Il mio URL di esempio, quindi è "/?q=%E5%B0%BA%E5%85%AB".

Nel mio contesto callback, ho:

HttpListenerContext context = Listener.EndGetContext();
string rawUrl = context.Request.RawUrl;
string query = context.Request.QueryString["q"];

Verifica dei risultati, ottengo:

rawUrl = "/?q=%E5%B0%BA%E5%85%AB" 
query = "尺八"

Ma se guardo context.Request.Url, ottengo {http://localhost:8080/?q=尺八}.

Sembra che la stringa di query context.Request.QueryString viene decodificato utilizzando alcuni codifica diversa da UTF-8.

La mia soluzione è quella di ignorare context.Request.QueryString e creare il mio in questo modo:

var queryString = HttpUtility.ParseQueryString(context.Request.Url.Query);

Questo mi dà il valore corretto, ma sembra qualcosa di un hack.

C'è un modo per dire al HttpListener (o il contesto, o la richiesta) per interpretare la stringa di query come UTF-8, che credo sia il comunque di serie? O devo solo vivere con questa soluzione?

È stato utile?

Soluzione

Per guardando il codice, si basa su ContentEncoding essere impostato su UTF-8. Ecco l'snipit dalla proprietà QueryString HttpListenerRequest:

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

Dal momento che non v'è alcun modo per modificare la proprietà ContentEncoding tua bloccato con il 'trucco'. Comunque, credo che l'utilizzo del HttpUtility.ParseQueryString è probabile che a servire il meglio.

Altri suggerimenti

Prova System.Web.HttpUtility

 string query = "d=bla bla bla";
 string encoded = System.Web.HttpUtility.UrlEncode( query, System.Text.Encoding.UTF8 );

Per saperne di più https: //msdn.microsoft.com/en-us/library/system.web.httputility(v=vs.110).aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top