2008-10-27 3 views
33

Gibt es eine Funktion, die eine maskierte Url-Zeichenfolge in seine nicht-gesäumte Form konvertiert? System.Web.HttpUtility.UrlDecode() kann diesen Job erledigen, aber ich möchte keinen Verweis auf System.Web.dll hinzufügen. Da meine App keine Webanwendung ist, möchte ich keine Abhängigkeit hinzufügen, um nur eine Funktion in einer Baugruppe zu verwenden.Dekodieren entkommene URL ohne Verwendung von HttpUtility.UrlDecode

UPDATE: Überprüfen Sie Rick Strahl's blog post über das gleiche Problem.

+1

Rick Strahls Beitrag ist ein Muss - er enthält den notwendigen Hintergrund und eine gründliche Analyse der verschiedenen Lösungen, die das .NET-Framework bietet (oder nicht anbietet). – Oliver

+0

Mögliches Duplikat von [Wie dekodiere ich einen URL-Parameter mit C#?] (Http://stackoverflow.com/questions/1405048/how-doi-i-decode-a-url-parameter-using-c) –

Antwort

58

EDIT: Verwenden Sie die statische Methode Uri.UnescapeDataString() Ihre URLs zu entschlüsseln:

Encoded: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

dies funktioniert nicht für mich, es gibt nur den ursprünglichen String-Pass an die 'Uri.UnescapeDataString (myurl) ' – Smith

+6

Achtung: Dies funktioniert nicht für Plus-Zeichen - http://blogs.msdn.com/b/ yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx Ich suche immer noch nach einer besseren Methode. –

+2

@Chris: Rick Strahl hat eine Utility-Klasse um 'Uri.UnescapeDataString()' erstellt, die die '+' Zeichen korrekt behandelt. Weitere Informationen finden Sie in seinem Blogpost (http://www.west-wind.com/weblog/posts/617930.aspx). – Oliver

0

Das Microsoft ACE-Team hat eine erweiterte (und bessere) Version von decode, in der Anti-XSS library. Ich bin mir jedoch nicht sicher, ob es gerade passiert.

(Ich verstehe nicht, warum man so besorgt über die Abhängigkeit von System.web.dll ehrlich zu sein)

+0

Der Grund ist, dass ich wegen eines einzigen Methodenaufrufs keine ziemlich große DLL in meinen Speicherplatz laden möchte. Es wäre gut, wenn jemand auf eine Implementierung verweist (wahrscheinlich Regex), die ich in mein Projekt kopieren und einfügen kann. – huseyint

+0

Eine Regex-Lösung wird nicht genug sein; Decodierung ist * schwer *. Wenn Sie wirklich besorgt sind, * hust *, Reflektor. Haben Sie sich tatsächlich die Speicherkosten für das Laden der Baugruppe angesehen? Es ist wahrscheinlich nicht so groß wie du denkst. – blowdart

+1

Beachten Sie, dass verschiedene Framework-Versionen (va "Client-Profil") ein guter Grund sind, dies zu vermeiden - aber nicht wert * zu * erregt zu sein ;-p –

0

Sie haben bereits eine große Abhängigkeit von dem .NET-Framework, CLR et al. In der Tat haben Sie bereits eine indirekte Abhängigkeit von System.Web.DLL; Ihre Anwendung kann nicht ohne ihre Anwesenheit auf dem lokalen Computer ausgeführt werden.

Und Sie sorgen sich um die Erinnerung? Haben Sie Speicherprobleme? Wenn Sie Speicherprobleme haben, die so extrem sind, dass Sie nicht mehrere KB DLLs in den Speicher Ihrer App laden können, warum codieren Sie dann .NET? Oder optimieren Sie gerade vorzeitig?

Also mach dir keine Sorgen darüber.

+5

Ihre Behauptung ist falsch; "client profile", "cf" und "silverlight" fehlen alle System.Web.dll; "Client-Profil" ist eine Version von regulären .NET, also ist das auffälligste. –

+1

@marc iirc wenn diese Frage beantwortet wurde, wurden die Kundenprofile nicht veröffentlicht/allgemein bekannt. Zweitens, er sagt nicht, welche Art von App, und tatsächlich, von der Art, wie er die Frage stellt, ist es offensichtlich, dass es eine Option ist, system.web.dll zu referenzieren. Ansonsten ist die Frage strittig. Meine Behauptung ist also höchstwahrscheinlich richtig. Nyah. – Will

4

System.Web.dll wird nicht geladen - wie andere bereits angemerkt haben, ist es nicht aufregend, wenn Sie nicht wissen, dass Sie mit Clients arbeiten müssen, die es nicht haben ("client profile", "compact framework") , "Micro Framework", "Silverlight").

Re Raum; es wird nicht viel wirklich sein; Beachten Sie, dass .NET-Assemblies auf einer Methode-für-Methode JIT-basiert sind, so dass nur durch die Verwendung einiger weniger Methoden ein signifikanter Overhead entsteht.

Das eigentliche Problem (IMO) ist Ihr Maß an Vertrauen, dass der Client System.Web.dll hat; Wenn Sie glücklich sind, dass sie den vollen Rahmen verwenden, dann gehen Sie einfach dafür.

+0

System.Web.dll ist * sehr * schwer, mit * bemerkbar * Startup-Auswirkungen. –

+0

@ComputerLinguist roll auf vNext, was? –

+0

Hat in 7 Jahren nichts mehr mitgemacht? Ich meine, es wird um vNext gehen müssen. –

0

@Smith
Ich hatte die speichern Sie das Problem. Keine Änderungen oder einfach nur weiter jumble.

Nach dem Testen vieler Dinge bemerkte ich eine Test-String wurde entschlüsselt. Letztendlich musste ich eine neue leere Zeichenkette erstellen, ihren Wert auf die codierte Zeichenkette setzen und dann WebUtility.HtmlDecode und Uri.UnescapeDataString auf der neuen Zeichenkette ausführen. Aus irgendeinem Grund musste ich das Dekodieren und die Uneszenierung in der Reihenfolge ausführen, die ich erwähnte. Bizarr.

Ich löste es mit so etwas.

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 arbeitet auch auf .NET 4.0 Client Profile.

+2

URL-Endcodierung/Decodierung! = HTML-Codierung/Decodierung. –

5

Wenn Sie .NET 4 verwenden.0 oder später, können Sie WebUtility.UrlDecode verwenden, die mit Client-Profil funktioniert und auch Pluszeichen korrekt verarbeitet (siehe this Diskussion).