Ho fatto un po 'di ricerche nel corso dell'ultimo giorno o giù di lì e penso di avere qualche informazione su questo.
Quando si utilizza Request.Querystring o HttpUtility.UrlDecode (o Encode), viene utilizzata la codifica specificata nell'elemento (in particolare l'attributo requestEncoding) di web.config (o la gerarchia .config se si haven ') t specificato) --- NOT Encoding.Default che è la codifica predefinita per il tuo server.
Quando la codifica è impostata su UTF-8, un singolo carattere unicode può essere codificato come valori esadecimale del 2% xx. Sarà anche decodificato in questo modo quando viene fornito l'intero valore.
Se si utilizza la codifica UrlDecoding con una codifica diversa da quella con cui è stato codificato l'url, si otterrà un risultato diverso.
Poiché HttpUtility.UrlEncode e UrlDecode possono prendere un parametro di codifica, è tentato di provare a codificare utilizzando una codepage ANSI, ma UTF-8 è il modo giusto per andare se si dispone del supporto del browser (apparentemente le vecchie versioni non lo fanno supporto UTF-8). Devi solo assicurarti che sia impostato correttamente e che entrambe le parti funzionino correttamente.
UTF-8 sembra essere la codifica di default: (dal riflettore .net System.Web.HttpRequest)
internal Encoding QueryStringEncoding
{
get
{
Encoding contentEncoding = this.ContentEncoding;
if (!contentEncoding.Equals(Encoding.Unicode))
{
return contentEncoding;
}
return Encoding.UTF8;
}
}
Seguendo il percorso per scoprire il this.ContentEncoding vi porta a (anche in HttpRequest)
public Encoding ContentEncoding
{
get
{
if (!this._flags[0x20] || (this._encoding == null))
{
this._encoding = this.GetEncodingFromHeaders();
if (this._encoding == null)
{
GlobalizationSection globalization = RuntimeConfig.GetLKGConfig(this._context).Globalization;
this._encoding = globalization.RequestEncoding;
}
this._flags.Set(0x20);
}
return this._encoding;
}
set
{
this._encoding = value;
this._flags.Set(0x20);
}
}
Per rispondere alla tua domanda specifica sulla differenza betwen Request.Url.Quer e Request.QueryString ... ecco come HttpRequest costruisce la sua proprietà URL:
public Uri Url
{
get
{
if ((this._url == null) && (this._wr != null))
{
string queryStringText = this.QueryStringText;
if (!string.IsNullOrEmpty(queryStringText))
{
queryStringText = "?" + HttpEncoder.CollapsePercentUFromStringInternal(queryStringText, this.QueryStringEncoding);
}
if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(0x1c);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
this._url = new Uri(this._wr.GetProtocol() + "://" + knownRequestHeader + this.Path + queryStringText);
}
}
catch (UriFormatException)
{
}
}
if (this._url == null)
{
string serverName = this._wr.GetServerName();
if ((serverName.IndexOf(':') >= 0) && (serverName[0] != '['))
{
serverName = "[" + serverName + "]";
}
this._url = new Uri(this._wr.GetProtocol() + "://" + serverName + ":" + this._wr.GetLocalPortAsString() + this.Path + queryStringText);
}
}
return this._url;
}
}
Si può vedere che sta usando la classe HttpEncoder per eseguire la decodifica, ma utilizza lo stesso valore di QueryStringEncoding.
Poiché sto già postando un sacco di codice qui e chiunque può ottenere .NET Reflector, ho intenzione di snippet il resto. La proprietà QueryString proviene da HttpValueCollection che utilizza il metodo FillFromEncodedBytes per chiamare infine HttpUtility.UrlDecode (con il valore QueryStringEncoding impostato in precedenza), che alla fine chiama HttpEncoder per decodificarlo. Sembra che usino una metodologia diversa per decodificare i byte effettivi di querystring, ma la codifica che usano per farlo sembra essere la stessa.
È interessante per me che HttpEncoder abbia così tante funzioni che sembrano fare la stessa cosa, quindi è possibile che ci siano differenze in quei metodi che possono causare un problema.
Entrambe le proprietà restituiscono la stessa stringa codificata per la maggior parte del tempo - i costruttori e l'analisi sono irrilevanti in questo caso. È solo dopo la chiamata di riscrittura che la codifica di Uri cambia. – zombat
Forse la tua risposta e la risposta di womps sotto combinate è la verità. Forse è il caso che si conserva la codifica Url usando un codice Latin-1 e l'altro usa UTF-8. –