Usiłuję napisać aplikację kliencką dla systemu Windows, która wywołuje witrynę z danymi. Aby ograniczyć instalację do minimum, próbuję używać tylko bibliotek dll w profilu klienta .NET Framework . Problem w tym, że muszę UrlEncode niektórych parametrów. Czy istnieje prosty sposób, aby to zrobić bez importowania pliku System.Web.dll, który nie jest częścią pliku Pofile klienta?
c#
.net
urlencode
.net-client-profile
Martin Brown
źródło
źródło
WebRequest
lubWebClient
. To jest powód, dla którego zapytałem o ten konkretny kod, ponieważ są pewne rzeczy, które można zrobić w kwestii poprawnego kodowania danych URL.Odpowiedzi:
System.Uri.EscapeUriString()
może być problematyczne z niektórymi znakami, dla mnie był to znak liczby / funta „#” w ciągu.Jeśli jest to dla Ciebie problem, spróbuj:
Oto odpowiedź na pytanie SO, która wyjaśnia różnicę:
Jaka jest różnica między EscapeUriString i EscapeDataString?
i zaleca stosowanie
Uri.EscapeDataString()
w dowolnym aspekcie.źródło
Uri.EscapeUriString
jest rzeczywiście bardzo problematyczny i nie należy go stosować, ponieważ próbuje on zrobić coś (unikając pełnych identyfikatorów URI), co jest w rzeczywistości niemożliwe do konsekwentnego wykonania. Zobacz tę odpowiedź, aby uzyskać szczegółowe wyjaśnienie.W użyciu .Net 4.5+
WebUtility
Tylko do sformatowania przesyłam to jako odpowiedź.
Nie udało mi się znaleźć dobrych przykładów porównujących je, więc:
Wyjścia:
W użyciu .Net 4.5+
WebUtility
.UrlEncode
Wygląda na to, że replikuje się
HttpUtility.UrlEncode
(w wersjach wcześniejszych niż 4.0) w przypadku bardziej powszechnych znaków:Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Uwaga:
EscapeUriString
zachowa prawidłowy ciąg znaków uri, co powoduje, że używa jak największej liczby znaków w postaci zwykłego tekstu.Zobacz odpowiedź na tabelę porównującą różne kodowania:
https://stackoverflow.com/a/11236038/555798
Podziały linii Wszystkie wymienione tutaj (inne niż
HttpUtility.HtmlEncode
) zostaną zamienione"\n\r"
na%0a%0d
lub%0A%0D
Zmodyfikuj to i dodaj nowe znaki do mojego ciągu testowego lub zostaw je w komentarzach, a ja je wyedytuję.
źródło
EscapeDataString
zamiastEscapeUriString
kodowania powrotów karetki i linii, a to wymagało bardziej agresywnego ucieczki, którego dokonałEscapeDataString
Możesz użyć
Uri.EscapeUriString (patrz http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )
źródło
Uri.EscapeUriString
. Nie „rozumie”, jakie części należy zakodować, jest to po prostu błędna próba zrobienia czegoś (unikanie pełnych identyfikatorów URI), co w rzeczywistości jest niemożliwe do konsekwentnego wykonania. Zobacz tę odpowiedź, aby uzyskać szczegółowe wyjaśnienie.Odpowiedzi tutaj są bardzo dobre, ale wciąż dla mnie niewystarczające.
Napisałem małą pętlę, który porównuje
Uri.EscapeUriString
sięUri.EscapeDataString
do wszystkich znaków od 0 do 255.UWAGA: Obie funkcje mają wbudowaną inteligencję, że znaki powyżej 0x80 są najpierw kodowane UTF-8, a następnie procentowo.
Oto wynik:
EscapeUriString
ma być używany do kodowania adresów URL, podczas gdyEscapeDataString
ma być używany do kodowania na przykład zawartości pliku cookie, ponieważ dane plików cookie nie mogą zawierać znaków zastrzeżonych'='
i';'
.źródło
Uri.EscapeUriString
, ponieważ unikanie pełnych identyfikatorów URI jest niemożliwe. Zobacz tę odpowiedź, aby uzyskać szczegółowe wyjaśnienie.Istnieje wersja użyteczna profilu klienta, klasa System.Net.WebUtility, obecna w profilu klienta System.dll. Oto link MSDN:
WebUtility
źródło
Oto przykład wysłania żądania POST, które poprawnie koduje parametry przy użyciu
application/x-www-form-urlencoded
typu zawartości:źródło
Aby UrlEncode bez użycia System.Web:
więcej szczegółów: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
źródło
źródło