c # HttpWebResponse Header-Codierung

8

Ich habe das folgende Problem. Ich kontaktiere eine Adresse, von der ich weiß, dass sie eine 301-Weiterleitung verwendet.

mit HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); und loHttp.AllowAutoRedirect = false; , so dass ich nicht umgeleitet werde.

Jetzt bekomme ich den Header der Antwort, um die neue URL zu identifizieren.

mit loWebResponse.GetResponseHeader("Location");

Das Problem ist, dass, da diese URL griechische Zeichen enthält, die zurückgegebene Zeichenfolge durcheinander ist (aufgrund der Kodierung).

Das gesamte Bildcodeweise:

%Vor%     
Alexandros B 11.12.2009, 15:46
quelle

3 Antworten

6

Wenn Sie das Standardverhalten ( loHttp.AllowAutoRedirect = true ) zulassen und Ihr Code nicht funktioniert (Sie werden nicht auf die neue Ressource umgeleitet), bedeutet dies, dass der Server den Header Location nicht korrekt codiert. Funktioniert die Weiterleitung im Browser?

Wenn zum Beispiel die Umleitungs-URL http://site/Μία_Σελίδα ist, muss der Location-Header wie http://site/%CE%95%CE%BD%CE%B9%CE%B1%CE%AF%CE%BF_%CE%94%CE%B5%CE% aussehen.

UPDATE:

Nachdem ich das Problem weiter untersucht habe, beginne ich zu vermuten, dass es etwas seltsames mit HttpWebRequest gibt. Wenn die Anfrage gesendet wird, sendet der Server die folgende Antwort:

%Vor%

Wie wir sehen können, enthält der Header Location griechische Zeichen, die nicht URL-codiert sind. Ich bin nicht ganz sicher, ob dies gemäß der HTTP-Spezifikation gilt. Was wir sicher sagen können, ist, dass ein Webbrowser es richtig interpretiert.

Hier kommt der interessante Teil. Es scheint, dass HttpWebRequest keine UTF-8-Codierung verwendet, um die Antwortheader zu parsen, da bei der Analyse des Location -Headers: http://www.site.com/buy/κινηÏή-ÏÏαθεÏή-ÏηλεÏÏνία/c/cn69569/ angegeben wird, was natürlich falsch ist und wenn versucht wird, den Server an diesen Ort weiterzuleiten antwortet mit einer neuen Weiterleitung und so weiter, bis die maximale Anzahl an Weiterleitungen erreicht ist und eine Ausnahme ausgelöst wird.

Ich konnte keine Möglichkeit finden, die Kodierung anzugeben, die von HttpWebRequest beim Parsen der Antwort-Header verwendet wird. Wenn wir TcpClient manuell verwenden, funktioniert das einwandfrei:

%Vor%

Ich bin wirklich verwirrt über dieses Verhalten. Gibt es eine Möglichkeit, die korrekte Codierung anzugeben, die von HttpWebRequest verwendet wird? Vielleicht sollte ein Anforderungsheader gesetzt sein?

Als Workaround können Sie versuchen, die Seite asp zu ändern, die die Weiterleitung ausführt, und den Code Location zu urlen. Wenn Sie beispielsweise in einer ASP.NET-Anwendung Response.Redirect(location) ausführen, wird der Speicherort automatisch html-codiert und alle nicht standardmäßigen Zeichen werden in die entsprechenden Entitäten konvertiert.

Wenn Sie beispielsweise Response.Redirect("http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/"); in einer ASP.NET-Anwendung verwenden, wird der Header Location auf Folgendes gesetzt:

%Vor%

Es scheint, dass dies bei klassischem ASP nicht der Fall ist.

    
Darin Dimitrov 11.12.2009, 16:20
quelle
1

Ich würde nicht erwarten, dass die Rückgabe-Zeichenkette fehlerhaft ist ... Wie stellen Sie fest, dass sie falsch formatiert ist? Die Zeichenkette sollte in einem Unicode-Format wie utf-8 sein, das die griechische Zeichenkette leicht darstellen könnte.

Es könnte sein, dass Sie einfach nicht die griechischen Schriftarten haben, um die Zeichenfolge darzustellen?

    
John Weldon 11.12.2009 15:48
quelle
1

Wie Darin Dimitrov erklärt, glaube ich, dass die Header-Kodierung durch einen Fehler in der HttpWebResponse-Klasse verursacht wird. Wir hatten das gleiche Problem, bei dem wir einen Cookie zur Kopfzeile hinzufügen wollten (Set-Cookie) und dieser Cookie würde nicht-ASCII-Zeichen enthalten. In unserem speziellen Fall wären dies die norwegischen Buchstaben "Æ", "Ø" und "Å" (in Groß- und Kleinschreibung). Wir konnten nicht herausfinden, wie das HeaderEncoding funktioniert, aber wir haben einen Workaround gefunden, bei dem die Base64-Codierung des Cookies verwendet wurde. Beachten Sie, dass dies nur funktioniert, wenn Sie sowohl die Client- als auch die Serverseite steuern (oder Sie können die Verantwortlichen für den serverseitigen Code überzeugen, die Base64-Codierung für Sie hinzuzufügen ... )

Auf der Serverseite:

%Vor%

Auf der Clientseite:

%Vor%

Beachten Sie, dass cookieDataAsUtf8Base64Encoded auf der Client-Seite der Datenteil des Cookies ist (das ist 'MyCookie = [data]', wobei 'MyCookie =' entfernt wird).

    
Kjetil Klaussen 05.09.2011 07:15
quelle