Domanda

Sto provando a scrivere un'applicazione Windows client che chiama un sito web per i dati. Per mantenere l'installazione al minimo sto provando solo utilizzare DLL in .NET Framework client Profilo . Il problema è che ho bisogno di UrlEncode alcuni parametri, c'è un modo semplice per fare questo senza importare System.Web.dll che non fa parte del Pofile client?

È stato utile?

Soluzione

System.Uri.EscapeUriString() può essere problematico con certi personaggi, per me è stato un / pound '#' cancelletto nella stringa.

Se questo è un problema per voi, provate:

System.Uri.EscapeDataString() //Works excellent with individual values

Ecco una domanda risposta così che spiega la differenza:

Qual è la differenza tra EscapeUriString e EscapeDataString?

e raccomanda l'uso di Uri.EscapeDataString() in ogni aspetto.

Altri suggerimenti

In .Net 4.5+ uso WebUtility

Proprio per la formattazione sto presentando questo come una risposta.

Impossibile trovare esempi di buone confrontando in modo:

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));

Uscite:

UrlEncode:             http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:       http://test#%20space%20123/text?var=val&another=two
EscapeDataString:      http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace:     http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:            http://test# space 123/text?var=val&another=two
UrlPathEncode:         http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

In .Net 4.5+ uso WebUtility .UrlEncode

Questo sembra HttpUtility.UrlEncode replicando (pre-v4.0) per i personaggi più comuni:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Nota:. EscapeUriString manterrà una stringa URI valido, che induce a utilizzare come molti personaggi in chiaro come possibile

Vedere questa risposta per una tabella comparativa delle varie codifiche:
https://stackoverflow.com/a/11236038/555798

interruzioni di riga Tutti loro elencati qui (diverso HttpUtility.HtmlEncode) ti permette di convertire in "\n\r" %0a%0d o %0A%0D

Non esitate a modificare questa e aggiungere nuovi personaggi alla mia stringa di prova, o lasciarli nei commenti e sarò modificarlo.

Le risposte qui sono molto buoni, ma ancora insufficiente per me.

ho scritto un piccolo anello che mette a confronto con Uri.EscapeUriString Uri.EscapeDataString per tutti i caratteri da 0 a 255.

. NOTA: Entrambe le funzioni hanno l'intelligenza incorporata che i personaggi di cui sopra 0x80 sono di prima codifica UTF-8 e poi cento codificati

Ecco il risultato:

******* Different *******

'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"


******* Not escaped *******

'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"

'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"

'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"

'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"

******* UTF 8 *******

.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....

EscapeUriString deve essere utilizzato per gli URL di codifica, mentre EscapeDataString deve essere utilizzato per codificare ad esempio il contenuto di un cookie, in quanto i dati cookie non devono contenere i caratteri riservati '=' e ';'.

C'è una versione profilo del cliente utilizzabile, classe System.Net.WebUtility, presente nel profilo client System.dll. Ecco il MSDN Link:

WebUtility

Ecco un esempio di invio di una richiesta POST che codifica correttamente i parametri con tipo di contenuto application/x-www-form-urlencoded:

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
    };
    var result = client.UploadValues("http://foo.com", values);
}

Per UrlEncode senza usare System.Web:

String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());

maggiori dettagli: https: //www.samnoble .it / 2014/05/21 / beware-webutility-urlencode-vs-httputility-urlencode /

System.Net.WebUtility.HtmlDecode
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top