Saya mencoba untuk menulis aplikasi klien windows yang memanggil situs web untuk data. Untuk menjaga agar instalasi minimum, saya hanya mencoba menggunakan dll di Profil Klien .NET Framework . Masalahnya adalah saya perlu UrlEncode beberapa parameter, apakah ada cara mudah untuk melakukan ini tanpa mengimpor System.Web.dll yang bukan bagian dari Pofile Klien?
c#
.net
urlencode
.net-client-profile
Martin Brown
sumber
sumber
WebRequest
atauWebClient
. Itulah alasan saya bertanya tentang kode khusus ini karena ada hal-hal yang dapat dilakukan tentang penyandian data url dengan benar.Jawaban:
System.Uri.EscapeUriString()
bisa bermasalah dengan karakter tertentu, bagi saya itu adalah tanda / pound '#' dalam string.Jika itu masalah bagi Anda, cobalah:
Berikut adalah jawaban pertanyaan SO yang menjelaskan perbedaannya:
Apa perbedaan antara EscapeUriString dan EscapeDataString?
dan merekomendasikan untuk digunakan
Uri.EscapeDataString()
dalam segala aspek.sumber
Uri.EscapeUriString
memang sangat bermasalah dan tidak boleh digunakan, karena mencoba melakukan sesuatu (lolos URI penuh) yang sebenarnya tidak mungkin dilakukan secara konsisten. Lihat jawaban ini untuk penjelasan terperinci.Dalam penggunaan .Net 4.5+
WebUtility
Hanya untuk memformat, saya mengirimkan ini sebagai jawaban.
Tidak dapat menemukan contoh bagus yang membandingkannya:
Keluaran:
Dalam penggunaan .Net 4.5+
WebUtility
.UrlEncode
Ini tampaknya mereplikasi
HttpUtility.UrlEncode
(pra-v4.0) untuk karakter yang lebih umum:Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Catatan:
EscapeUriString
akan menyimpan string uri yang valid, yang menyebabkannya menggunakan sebanyak mungkin karakter plaintext.Lihat jawaban ini untuk Tabel yang Membandingkan berbagai Pengodean:
https://stackoverflow.com/a/11236038/555798
Line Breaks Semuanya terdaftar di sini (selain
HttpUtility.HtmlEncode
) akan dikonversi"\n\r"
menjadi%0a%0d
atau%0A%0D
Silakan mengedit ini dan menambahkan karakter baru ke string pengujian saya, atau biarkan di komentar dan saya akan mengeditnya.
sumber
EscapeDataString
daripadaEscapeUriString
saat kami menyandikan carriage return dan line feeds dan ini membutuhkan pelarian yang lebih agresif yang dilakukan olehEscapeDataString
Kamu bisa memakai
Uri.EscapeUriString (lihat http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )
sumber
Uri.EscapeUriString
. Itu tidak "memahami" bagian mana yang harus dikodekan, itu hanya upaya sesat dalam melakukan sesuatu (melarikan diri URI penuh) yang sebenarnya tidak mungkin dilakukan secara konsisten. Lihat jawaban ini untuk penjelasan terperinci.Jawabannya di sini sangat bagus, tetapi masih kurang bagi saya.
Saya menulis loop kecil yang membandingkan
Uri.EscapeUriString
denganUri.EscapeDataString
untuk semua karakter dari 0 hingga 255.CATATAN: Kedua fungsi memiliki kecerdasan bawaan bahwa karakter di atas 0x80 pertama kali dikodekan UTF-8 dan kemudian dikodekan persen.
Inilah hasilnya:
EscapeUriString
digunakan untuk menyandikan URL, sedangkanEscapeDataString
untuk menyandikan misalnya konten Cookie, karena data Cookie tidak boleh berisi karakter yang dilindungi undang-undang'='
dan';'
.sumber
Uri.EscapeUriString
, karena melarikan diri dari URI penuh tidak mungkin dilakukan secara konsisten. Lihat jawaban ini untuk penjelasan terperinci.Ada versi yang dapat digunakan profil klien, kelas System.Net.WebUtility, hadir di profil klien System.dll. Inilah Tautan MSDN:
WebUtilitas
sumber
Berikut adalah contoh pengiriman permintaan POST yang menyandikan parameter dengan benar menggunakan
application/x-www-form-urlencoded
tipe konten:sumber
Untuk UrlEncode tanpa menggunakan System.Web:
lebih detail: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
sumber
sumber