System.Web kullanmadan UrlEncode nasıl yapılır?


310

Veri için bir web sitesini çağıran bir windows istemci uygulaması yazmaya çalışıyorum. Yüklemeyi minimumda tutmak için yalnızca .NET Framework İstemci Profilinde dll'leri kullanmaya çalışıyorum . Sorun bazı parametreler UrlEncode gerekir, Client Pofile bir parçası olmayan System.Web.dll alma olmadan bunu yapmak için kolay bir yolu var mı?


Web sitesine nasıl çağrı yaptığınızı gösterebilir misiniz? Belki orada yapılabilecek bir şey vardır.
Darin Dimitrov

Meraktan, bir web sitesini System.Web kullanmadan veri için nasıl çağırırsınız?
Patrick McDonald

@ Patrick, muhtemelen WebRequestveya kullanıyor WebClient. Bu nedenle bu özel kod hakkında sordum, çünkü düzgün url kodlama verileri hakkında yapılabilecek şeyler var.
Darin Dimitrov

1
Bir System.Net.WebRequest nesnesi kullanıyorum. Sonra GetRequestStream çağırmak ve Post parametreleri akışa yazmak. ContentType'ı "application / x-www-form-urlencoded" olarak ayarladım.
Martin Brown

1
Tabii ki bir GET isteği gerçekleştiriyor ve parametreleri URL'ye ekliyorsam, bu eşit derecede iyi olurdu.
Martin Brown

Yanıtlar:


317

System.Uri.EscapeUriString() bazı karakterlerle sorunlu olabilir, benim için dizede bir sayı / pound '#' işareti vardı.

Bu sizin için bir sorunsa, şunu deneyin:

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

İşte farkı açıklayan bir SO soru cevabı:

EscapeUriString ve EscapeDataString arasındaki fark nedir?

ve Uri.EscapeDataString()her yönüyle kullanılmasını önerir .


1
Yanlış: blogs.msdn.com/b/yangxind/archive/2006/11/09/… Şifrelenmeyecekleri için artı işaretleriyle ilgili sorunlarınız olacak.
Chris Weber

7
Bu blog yazısı biraz eski ve ben sadece "Uri Kaçtı" tam bir url var ve tüm alanlarda% 20 oldu, bu yüzden onlar düzeltmek düşünüyorum. Net 4.5 kullanıyorum.
Mart'ta Rodi

Bir POST işlemi için veri hazırlıyorsanız, EscapeDataString de çok uzun dizeleri desteklemez. stackoverflow.com/questions/6695208/…
Bron Davies

Uri.EscapeUriStringgerçekten çok problemlidir ve tutarlı bir şekilde yapılması imkansız olan bir şey (tam URI'lerden kaçan) yapmaya çalıştığından kullanılmamalıdır . Ayrıntılı bir açıklama için bu cevaba bakınız .
Livven

Ayrıca bir '' Uzay karakteri.
Waqas Shabbir

252

Net 4.5+ kullanımında WebUtility

Sadece biçimlendirmek için bunu cevap olarak gönderiyorum.

Bunları karşılaştıran iyi bir örnek bulunamadı:

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));

Çıktılar:

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

Net 4.5+ kullanımında WebUtility.UrlEncode

Bu HttpUtility.UrlEncode, daha yaygın karakterler için çoğalıyor (v4.0 öncesi) gibi görünüyor :
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Not: EscapeUriStringgeçerli bir uri dizesi tutacaktır, bu da mümkün olduğunca çok düz metin karakteri kullanmasına neden olur.

Çeşitli Kodlamaları Karşılayan Tablo için bu cevaba bakınız:
https://stackoverflow.com/a/11236038/555798

Çizgi Sonları Hepsi (dışındaki burada listelenir HttpUtility.HtmlEncodedönüştürecektir) "\n\r"içine %0a%0dveya%0A%0D

Lütfen bunu düzenleyebilir ve test dizime yeni karakterler ekleyebilir veya yorumlarda bırakabilirsiniz.


Benim durumumda , satır başlarını ve satır beslemelerini kodlamak EscapeDataStringyerine kullanmak zorunda kaldım EscapeUriStringve bunlar tarafından gerçekleştirilen daha agresif kaçış gerekiyorduEscapeDataString
David O'Meara

1
daha fazla örnek, isterseniz kendi test durumlarınızı sağlayabilirsiniz. Aşağıda, çalıştırmanın ve farklılıkları gösteren diğer kodlama yöntemlerinin bir örneği verilmiştir dotnetfiddle.net/12IFw1
Maslow

3
WebUtility.UrlEncode () ve WebUtility.UrlDecode () 4.5+ sürümleridir. 4.0 sürümünde mevcut değiller.
Derek Kalweit

Msdn diyor ki: "Evrensel Windows Platformu: 4.5'ten beri kullanılabilir, .NET Framework: 4.0'dan beri kullanılabilir" ...
Timin

54

Kullanabilirsiniz

Uri.EscapeUriString (bkz. Http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )


Bu ve EscapeDataString arasında bir fark var mı?
Martin Brown

3
EscapeUriString kullanmak istiyorsunuz. EscapeUriString tüm url'yi kodlamaya çalışacak (http: // part dahil), EscapeUriString gerçekten hangi parçaların kodlanması gerektiğini anlayacak
Matthew Manela

1
Görüyorum ki, bu durumda getData olarak bir URL iletmek isteyebileceğim için muhtemelen EscapeDataString'i isteyeceksiniz. Bu örnekte bir URL'ye ekliyorum.
Martin Brown

5
@MatthewManela Eminim Oct1 yorum EscapeDataString kodlamak çalışacağız okumalıdır eminim ...
Maslow

Kullanma Uri.EscapeUriString. Hangi parçaların kodlanması gerektiğini "anlamıyor", sadece tutarlı bir şekilde yapılması imkansız olan bir şey (tam URI'lerden kaçma) yapmak için yanlış yönlendirilmiş bir girişim. Ayrıntılı bir açıklama için bu cevaba bakınız .
Livven

20

Buradaki cevaplar çok iyi, ama yine de benim için yetersiz.

Ben karşılaştıran bir küçük döngü yazmış Uri.EscapeUriStringile Uri.EscapeDataString0'dan 255 tüm karakterler için.

NOT: Her iki işlev de 0x80'in üzerindeki karakterlerin önce UTF-8 kodlu ve sonra yüzde kodlu olduğu yerleşik zekaya sahiptir.

İşte sonuç:

******* 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"
.....

EscapeUriStringURL'leri EscapeDataStringkodlamak için kullanılırken, örneğin bir Çerezin içeriğini kodlamak için kullanılır, çünkü Çerez verisi ayrılmış karakterleri içermemelidir '='ve ';'.


güzel analiz ve arıza burada, çok yararlı. Herkes görmek için iyi olurdu performans kriterleri (her üç yöntemi karşılaştırmak) varsa veya biliyorsa
Shaun Wilson

Bu iyi bir analiz ve paket servisi kullanmamalısınız Uri.EscapeUriString, çünkü tam URI'lerden kaçmak tutarlı bir şekilde yapmak imkansızdır. Ayrıntılı bir açıklama için bu cevaba bakınız .
Livven

16

İstemci profili System.dll içinde bulunan bir istemci profili kullanılabilir sürümü, System.Net.WebUtility sınıfı vardır. İşte MSDN Bağlantısı:

WebUtility


Bu sınıfa ait yardım sayfasının özellikle "Web isteklerini işlerken URL'leri kodlamak ve kodunu çözmek için yöntemler sağlar" yazdığını unutmayın. bu yüzden yöntemleri iyi adlandırmamış olabilirler.
James White

İyi bir nokta, diyelim ki, neden bir erkek kardeşi oylamıyorsunuz;) Bu aşağı oylama 2 yıldır beni rahatsız ediyor! JK ... ama dürüst olmak gerekirse, muhtemelen bu nedenle, Microsoft'un belgelerindeki hatalar için bir itibar aldığım için talihsiz bir bağlantı yayınladım ...
Sprague

11
Görünüşe göre UrlEncode ve UrlDecode, WebNet'e yalnızca .Net'in 4.5 sürümünde eklenmiştir.
Martin Brown

8

Aşağıda, application/x-www-form-urlencodediçerik türünü kullanarak parametreleri düzgün şekilde kodlayan bir POST isteği gönderme örneği verilmiştir :

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


-3
System.Net.WebUtility.HtmlDecode

WebUtility sınıfı, Web isteklerini işlerken URL'lerin kodlanması ve kodunun çözülmesi için yöntemler sağlar. HttpUtility ile aynı şeyi yapar, ancak System.Web ad alanı
dışındadır

3
Yanlış çünkü HtmlDecodes ve sorulan soru gibi UrlEncode değil. HTML kodlaması URL kodlamasından farklı olduğu için HtmlEncode bile yanlış olur.
Martin Brown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.