2008-10-27 18 views
33

Czy jest jakaś funkcja, która konwertuje eskapowany łańcuch adresu URL do postaci bez zmiany znaczenia? System.Web.HttpUtility.UrlDecode() może wykonać tę pracę, ale nie chcę dodawać odwołania do System.Web.dll. Ponieważ moja aplikacja nie jest aplikacją WWW, nie chcę dodawać zależności tylko przy użyciu funkcji w zespole.Dekodowanie adresu ucieczki bez użycia HttpUtility.UrlDecode

AKTUALIZACJA: Sprawdź numer Rick Strahl's blog post dotyczący tego samego problemu.

+1

Posta Ricka Strahla jest koniecznością - zawiera niezbędne tło i dogłębną analizę różnych rozwiązań oferowanych przez platformę .NET (lub ich nie oferuje). – Oliver

+0

Możliwy duplikat [Jak zdekodować parametr adresu URL za pomocą C#?] (Http://stackoverflow.com/questions/1405048/how-do-i-decode-a-url-parameter-using-c) –

Odpowiedz

58

EDIT: pomocą metody statycznej Uri.UnescapeDataString() do dekodowania adresów URL:

zakodowane:http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

Decoded:http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

+0

to nie działa dla mnie, ale po prostu zwraca oryginalne hasło do 'Uri.UnescapeDataString (myurl)' – Smith

+6

Uwaga: to nie działa dla znaków plusa - http://blogs.msdn.com/b/ yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx Wciąż szukam lepszej metody. –

+2

@Chris: Rick Strahl zbudował klasę narzędzi wokół 'Uri.UnescapeDataString()', która poprawnie obsługuje znaki '+ '. Więcej informacji można znaleźć w [jego poście na blogu] (http://www.west-wind.com/weblog/posts/617930.aspx). – Oliver

0

Zespół Microsoft ACE ma rozszerzoną (i lepszą) wersję dekodowania w wersji Anti-XSS library. Jednak nie jestem pewien, czy to po prostu przechodzi.

(nie widzę dlaczego jesteś, że martwi się o uzależnieniu od System.web.dll być szczery)

+0

Powód jest to, że nie chcę ładować dość dużą bibliotekę DLL do mojej przestrzeni pamięci ze względu na tylko jedno wywołanie metody. Byłoby dobrze, gdyby ktoś wskazał implementację (prawdopodobnie używa Regex), którą mogę skopiować/wkleić do mojego projektu. – huseyint

+0

Rozwiązanie typu regex nie wystarczy; dekodowanie jest * trudne *. Jeśli naprawdę się martwisz, * kaszle *, reflektor. Czy rzeczywiście spojrzałeś na koszt pamięci ładowania zespołu? Prawdopodobnie nie jest tak duży, jak myślisz. – blowdart

+1

Należy zauważyć, że różne wersje szkieletowe (szczególnie "profil klienta") są dobrym powodem, aby tego uniknąć - ale nie warto się tym * zbyt * ekscytować ;-p –

0

Już mają ogromną zależność ramach .NET CLR in. W rzeczywistości masz już pośrednią zależność od System.Web.DLL; twoja aplikacja NIE MOŻE URUCHOMIĆ bez jej obecności na lokalnym komputerze.

A martwisz się pamięcią? Czy masz problemy z pamięcią? Jeśli masz problemy z pamięcią tak ekstremalne, nie możesz załadować kilku kilobajtów DLL do pamięci aplikacji, to dlaczego kodujesz .NET? A może po prostu przedwcześnie optymalizujesz?

Więc nie martw się o to.

+5

Twoja asercja jest niepoprawna; "profil klienta", "cf" i "silverlight" nie będą zawierać System.Web.dll; "profil klienta" to wersja zwykłego .NET, więc jest to najbardziej uderzające. –

+1

@ marc iirc po uzyskaniu odpowiedzi profile klientów nie zostały opublikowane/powszechnie znane. Po drugie, nie mówi, jaka aplikacja, a właściwie od sposobu, w jaki zadaje pytanie, oczywiste jest, że jest to opcja odniesienia do pliku system.web.dll. W przeciwnym razie pytanie jest dyskusyjne. Tak więc moje twierdzenie najprawdopodobniej jest poprawne. Nyah. – Will

4

Ponowne ładowanie System.Web.dll - jak zauważyli inni, nie warto się tym ekscytować, jeśli nie wiesz, że musisz radzić sobie z klientami, którzy mogą go nie mieć ("profil klienta", "kompaktowy framework") , "micro framework", "silverlight").

Re kosmiczna; to naprawdę nie będzie dużo; zauważ, że zespoły .NET są JITted na zasadzie metoda-metoda, więc nie będzie żadnego znaczącego narzutu tylko z wykorzystaniem kilku metod.

Prawdziwym problemem (IMO) jest twój poziom zaufania, że ​​klient ma System.Web.dll; jeśli jesteś szczęśliwy, że używają pełnej struktury, to po prostu idź za nią.

+0

System.Web.dll jest * bardzo * ciężki, z * zauważalnym * początkowym wpływem. –

+0

@ComputerLinguist roll na vNext, co? –

+0

Czy w ciągu 7 lat nic się nie zmieniło? Chodzi mi o to, że będzie musiał dla vNext. –

0

@Smith
byłem posiadające uratować problem. Brak zmian lub dalsze pomieszanie.

Po przetestowaniu wielu rzeczy zauważyłem, że łańcuch testowy dekodował. Ostatecznie musiałem stworzyć nowy pusty ciąg, ustawić jego wartość na zakodowany ciąg, a następnie uruchomić WebUtility.HtmlDecode i Uri.UnescapeDataString w nowym łańcuchu. Z jakiegoś powodu musiałem uruchomić dekodowanie i unescape w kolejności, o której wspomniałem. Dziwaczny.

Rozwiązałem to z czymś takim.

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d" 

Dim strDecoded as string = "" 
strDecoded = strEncoded 
strDecoded = WebUtility.HtmlDecode(strDecoded) 
strDecoded = Uri.UnescapeDataString(strDecoded) 
-2

System.Net.WebUtility.HtmlDecode pracuje również nad profilem klienta .NET 4.0.

+2

Kodowanie/dekodowanie adresu URL! = Kodowanie/dekodowanie HTML. –

5

Jeśli używasz .NET 4.0 lub nowszy, możesz użyć WebUtility.UrlDecode, który działa z profilem klienta, a także poprawnie przetwarza znaki plus (zobacz dyskusję this).