Zuerst einige kurze Hintergrundinformationen ... Im Rahmen einer Integration mit einem Drittanbieter habe ich eine C # .Net-Webanwendung, die eine URL mit einer Reihe von Informationen in der Abfragezeichenfolge empfängt. Diese URL wird mit einem MD5-Hash und einem gemeinsamen geheimen Schlüssel signiert. Im Grunde ziehe ich die Abfragezeichenfolge, entferne ihren Hash, führe meinen eigenen Hash für die verbleibende Abfragezeichenkette aus und stelle sicher, dass meins mit dem gelieferten übereinstimmt.
Ich erhalte den Uri auf folgende Weise ...
%Vor% Mein Problem stammt von Abfragezeichenfolgen, die Sonderzeichen wie einen Umlaut (ü) enthalten. Der Anbieter berechnet seinen Hash basierend auf der RFC 2396-Darstellung, die %FC
ist. Meine C # .Net App berechnet ihren Hash basierend auf der RFC 3986-Darstellung, die %C3%BC
ist. Unnötig zu sagen, unsere Hashes stimmen nicht überein, und ich werfe meine Fehler.
Seltsamerweise sagt die Dokumentation für die Uri-Klasse in .Net , dass es so sein sollte folgen Sie RFC 2396, wenn nicht anders auf RFC 3986 festgelegt, aber ich habe nicht den Eintrag in meiner web.config
-Datei, die sie sagen, ist für dieses Verhalten erforderlich.
Wie kann ich den Uri-Konstruktor zwingen, die RFC 2396-Konvention zu verwenden?
Fehlt das, gibt es eine einfache Möglichkeit, die RFC 3986 Oktettpaare in RFC 2396 Oktette zu konvertieren?
Nichts mit deiner Frage zu tun, aber warum schaffst du hier einen neuen Uri? Du kannst einfach
string queryFromVendor = Request.Url.Query.Substring(1)
; - atticae
+1 für Attika! Ich ging zurück, um zu versuchen, den fremden Uri zu entfernen, den ich kreierte, und plötzlich hatte der String den Umlaut als UTF-8 anstelle von UTF-16 codiert.
Zuerst dachte ich, das würde nicht funktionieren. Irgendwo entlang der Linie hatte ich versucht, die URL mit Request.QueryString
abzurufen, aber dies verursachte den Umlaut als %ufffd
, was das -Zeichen ist. Im Interesse einer neuen Perspektive versuchte ich den Vorschlag von atticae und es funktionierte.
Ich bin mir ziemlich sicher, dass die Antwort mit etwas, was ich hier lese .
C # verwendet UTF-16 in all seinen Strings, mit Werkzeugen zum Codieren, wenn es um Streams und Dateien geht, die uns auf ... bringen.
ASP.NET verwendet standardmäßig UTF-8, und es ist schwer, an eine Zeit zu denken, in der es keine gute Wahl ist ...
Meine Probleme sind von hier her entstanden ...
%Vor% Indem Sie Request.Url
uri verwenden und ein anderes uri erstellen, wurde es als C # -Standard UTF-16 codiert. Mit dem ursprünglichen URI blieb es im .Net-Standard UTF-8.
Danke an alle für Ihre Hilfe.
Ich frage mich, ob das ein bisschen Ablenkungsmanöver ist:
Ich sage das, weil FC die UTF16-Darstellung des u mit Umlaut ist; C2BC ist die UTF8-Darstellung.
Ich frage mich, ob eine der System.Text.Encoding-Methoden, um die Quelldaten in eine normale .Net-Zeichenfolge zu konvertieren, helfen könnte.
Diese Frage könnte auch von Interesse sein: URLs von rfc2396 kodieren und decodieren
Ich kenne die Standardcodierung für Uri-Konstruktoren nicht, aber wenn alles andere fehlschlägt, könnten Sie die URL immer selbst entschlüsseln und in der von Ihnen gewünschten Codierung codieren.
Die HttpUtility-Klasse hat eine Methode UrlDecode()
und UrlEncode()
, mit der Sie die System.Text.Encoding als zweiter Parameter.
Zum Beispiel:
%Vor%Tags und Links asp.net url-encoding uri rfc3986 rfc2396