Hoe kan jy UrlEncode sonder die gebruik van System.Web?
-
27-09-2019 - |
Vra
Ek probeer om 'n Windows kliënt aansoek wat 'n webwerf vir data oproepe skryf. Om te verseker dat die installasie van 'n minimum Ek probeer net gebruik dlls in die NET Framework kliënt Profiel . Die probleem is dat ek nodig het om te UrlEncode sommige parameters, is daar 'n maklike manier om dit te doen sonder die invoer van SYSTEM.WEB.DLL wat nie deel is van die kliënt Skep indeks?
Oplossing
System.Uri.EscapeUriString()
kan problematies met sekere karakters wees, vir my was dit 'n aantal / pond '# 'n teken in die tou.
As dit is 'n kwessie vir jou, probeer:
System.Uri.EscapeDataString() //Works excellent with individual values
Hier is 'n SO vraag antwoord dat die verskil verduidelik:
Wat is die verskil tussen EscapeUriString en EscapeDataString?
en beveel om gebruik te maak Uri.EscapeDataString()
in enige aspek.
Ander wenke
In Net 4.5+ gebruik WebUtility
Net vir opmaak ek hierdie indiening as 'n antwoord.
Kan nie vind enige goeie voorbeelde te vergelyk so:
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));
Uitsette:
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+ gebruik WebUtility
.UrlEncode
Dit lyk te herhaal HttpUtility.UrlEncode
(pre-v4.0) vir die meer algemene karakters:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Nota:. EscapeUriString
sal 'n geldige uri string, wat veroorsaak dat dit te gebruik as baie plat karakters as moontlik te hou
Sien hierdie antwoord vir 'n Table Vergelyk die verskillende enkoderings:
https://stackoverflow.com/a/11236038/555798
Line Trips
Almal van hulle gelys hier (behalwe HttpUtility.HtmlEncode
) sal "\n\r"
omskep in %0a%0d
of %0A%0D
Neem asseblief die vrymoedigheid om wysig hierdie en nuwe karakters by te voeg aan my toets string, of laat hulle in die kommentaar en ek sal dit verander.
Jy kan gebruik
Uri.EscapeUriString (sien http://msdn.microsoft com / af-ons / library / system.uri.escapeuristring.aspx )
Die antwoorde hier is baie goed, maar nog steeds onvoldoende vir my.
Ek het 'n klein lus dat Uri.EscapeUriString
vergelyk met Uri.EscapeDataString
vir al die karakters 0-255.
NOTA:. Beide funksies het die ingeboude intelligensie wat karakters bo 0x80 is eerste UTF-8 geïnkripteer en dan persent geïnkripteer
Hier is die resultaat:
******* 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
is om gebruik te word om enkodeer URLs, terwyl EscapeDataString
is om gebruik te word om enkodeer byvoorbeeld die inhoud van 'n koekie, want Cookie data moet nie bevat die gereserveerde karakters '='
en ';'
.
Daar is 'n kliënt profiel bruikbare weergawe, System.Net.WebUtility klas, teenwoordig in kliëntprofiel System.dll. Hier is die MSDN Link:
Hier is 'n voorbeeld van die stuur van 'n POST versoek dat behoorlik kodeer parameters met behulp van tipe application/x-www-form-urlencoded
inhoud:
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "param1", "value1" },
{ "param2", "value2" },
};
var result = client.UploadValues("http://foo.com", values);
}
Om UrlEncode sonder die gebruik van 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());
meer besonderhede: https: //www.samnoble Co.uk. / 2014/05/21 / pasop-webutility-urlencode-vs-httputility-urlencode /
System.Net.WebUtility.HtmlDecode