Ich versuche, eine Anfrage an eine URL wie diese "http://mysite.dk/tværs?test=æ" aus einer asp.net-Anwendung zu senden, und ich habe Probleme, die Querystring richtig zu kodieren. Oder der Querystring ist korrekt kodiert, der Dienst, mit dem ich mich verbinde, versteht ihn nicht richtig.
Ich habe versucht, die Anfrage mit verschiedenen Browsern zu senden und zu protokollieren, wie sie die Anfrage mit Wireshark verschlüsseln, und ich bekomme diese Ergebnisse:
%Vor%Sowohl Firefox als auch IE und Curl erhalten die korrekten Ergebnisse vom Dienst. Beachten Sie, dass sie das dänische Sonderzeichen "æ" in der Abfragezeichenfolge anders codieren.
Wenn ich die Anfrage von meiner asp.net-Anwendung mit HttpWebRequest sende, wird die URL folgendermaßen codiert:
%Vor%Er codiert den Querystring genauso wie der Pfadteil der URL. Der Remotedienst versteht diese Codierung nicht, daher bekomme ich keine korrekte Antwort.
Für den Datensatz ist "æ" (U + 00E6)% E6 in ISO-LATIN-1 und% C3% A6 in UTF-8.
Ich könnte den Remote-Dienst ändern, um den UTF-8-codierten Querystring zu akzeptieren, aber dann würde der Dienst in den Browsern nicht mehr funktionieren und ich bin nicht wirklich daran interessiert. Gibt es eine Möglichkeit, in .NET anzugeben, dass es keine Querystrings mit UTF-8 codieren soll?
Ich erstelle die Webanfrage wie folgt:
%Vor%Aber das Problem scheint von System.Uri zu stammen, das anscheinend in WebRequest.Create verwendet wird:
%Vor%Ich habe meinen Remote-Webservice geändert, um zu erwarten, dass die Abfragezeichenfolge UTF-8-kodiert ist. Es löst mein unmittelbares Problem, der Webservice kann sowohl von PHP als auch von .NET Framework nicht korrekt aufgerufen werden.
Allerdings ist das Verhalten in Browsern jetzt merkwürdig. Kopieren Sie eine URL wie "http://mysite.dk/tv%C3%A6rs?test=%C3%A6" in den Browser und drücken Sie die Eingabetaste, um die kodierten Zeichen zu korrigieren und den Ort als "http: //mysite.dk/tværs?test=æ ". Wenn Sie dann die Seite neu laden (F5), funktioniert es immer noch. Wenn ich aber auf die Adressleiste klicke und erneut die Return-Taste drücke, wird der Querystring mit latin-1 codiert und schlägt fehl.
Für alle Interessierten gibt es einen alten Firefox Bugreport über das Problem: Ссылка (danke an @dtb )
Es scheint also, dass es keine gute Lösung gibt.
Danke an alle, die geholfen haben!
Es sieht so aus, als ob Sie UrlEncode über die gesamte URL anwenden - das ist nicht korrekt, Pfade und Abfragezeichenfolgen sind anders codiert, als Sie gesehen haben. Was macht die Codierung der URI, WebRequest?
Sie könnten die verschiedenen Teile manuell mit einem UriBuilder erstellen oder manuell mit encodieren UrlPathEncode für den Pfad und UrlEncode für die Namen und Werte der Abfragezeichenfolge.
Bearbeiten:
Wenn das Problem im Pfad und nicht in der Abfragezeichenfolge liegt, können Sie versuchen, IRI-Unterstützung über web.config
%Vor%Das sollte dann internationale Charaktere im Pfad alleine lassen.
Tags und Links c# asp.net http encoding query-string