Frage

ich habe folgendes Problem. Ich Kontakt eine Adresse, die ich weiß, verwendet eine 301-Weiterleitung.

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

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

mit loWebResponse.GetResponseHeader("Location");

Das Problem ist, dass, da diese URL der Zeichenfolge griechische Zeichen enthält zurückgegeben wird, alle durcheinander gewürfelt (durch Codierung).

Das vollständige Bild codewise:

HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
loHttp.ContentType = "application/x-www-form-urlencoded";
loHttp.Method = "GET";

Timeout = 10000;

loHttp.AllowAutoRedirect = false;
HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

string url= loWebResponse.Headers["Location"];
War es hilfreich?

Lösung

Wenn Sie das Standardverhalten lassen (loHttp.AllowAutoRedirect = true) und der Code funktioniert nicht (Sie erhalten auf die neue Ressource nicht umgeleitet) bedeutet dies, dass der Server die Location Header kodiert korrekt. Ist die Umleitung im Browser zu arbeiten?

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


UPDATE:

Nach weiteren das Problem zu untersuchen ich beginne zu vermuten, dass es etwas seltsam mit HttpWebRequest. Wenn die Anforderung gesendet wird, sendet der Server die folgende Antwort:

HTTP/1.1 301 Moved Permanently
Date: Fri, 11 Dec 2009 17:01:04 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Location: http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/
Content-Length: 112
Content-Type: text/html; Charset=UTF-8
Cache-control: private
Connection: close
Set-Cookie: BIGipServerpool_webserver_gr=1007732746.36895.0000; path=/


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

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

Hier kommt der interessante Teil. Es scheint, dass HttpWebRequest nicht UTF-8-Codierung nicht verwenden, um die Antwort-Header zu analysieren, weil, wenn der Location Header Analyse gibt es: http://www.site.com/buy/κινηÏή-ÏÏαθεÏή-ÏηλεÏÏνία/c/cn69569/, was natürlich falsch ist, und wenn es der Server antwortet mit einer neuen Umleitung zu diesem Ort zu umleiten versucht und so weiter, bis die maximale Anzahl von Umleitungen erreicht ist und eine Ausnahme ausgelöst wird.

Ich konnte keine Möglichkeit finden die Codierung von HttpWebRequest verwendet, um anzugeben, wenn die Antwort-Header-Parsing. Wenn wir TcpClient manuell funktioniert es völlig in Ordnung, :

using (var client = new TcpClient())
{
    client.Connect("www.site.com", 80);

    using (var stream = client.GetStream())
    {
        var writer = new StreamWriter(stream);
        writer.WriteLine("GET /default/defaultcatg.asp?catg=69569 HTTP/1.1");
        writer.WriteLine("Host: www.site.com");
        writer.WriteLine("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090805 Shiretoko/3.5.2");
        writer.WriteLine("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        writer.WriteLine("Accept-Language: en-us,en;q=0.5");
        writer.WriteLine("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        writer.WriteLine("Connection: close");
        writer.WriteLine(string.Empty);
        writer.WriteLine(string.Empty);
        writer.WriteLine(string.Empty);
        writer.Flush();

        var reader = new StreamReader(stream);
        var response = reader.ReadToEnd();
        // When looking at the response it correctly reads 
        // Location: http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/
    }
}

So bin ich durch dieses Verhalten wirklich verwirrt. Gibt es eine Möglichkeit die richtige Codierung von HttpWebRequest verwendet angeben? Vielleicht sollten einige Request-Header gesetzt werden?

Als Abhilfe kann versuchen, Sie könnten die asp Seite ändern, die die Umleitung führt und urlencode die Location-Header. Zum Beispiel, wenn sie in einer ASP.NET-Anwendung Sie eine Response.Redirect(location) durchführen, wird die Position automatisch sein HTML codiert und alle Nicht-Standard-Zeichen werden in ihre entsprechenden Einheiten umgewandelt werden.

Zum Beispiel, wenn Sie: Response.Redirect("http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/"); in einer ASP.NET-Anwendung werden die Location Header gesetzt werden:

http://www.site.com/buy/%ce%ba%ce%b9%ce%bd%ce%b7%cf%84%ce%ae-%cf%83%cf%84%ce%b1%ce%b8%ce%b5%cf%81%ce%ae-%cf%84%ce%b7%ce%bb%ce%b5%cf%86%cf%89%ce%bd%ce%af%ce%b1/c/cn69569

Es scheint, dass dies mit klassischen ASP nicht der Fall ist.

Andere Tipps

Ich würde die Rückkehr String nicht erwarten malformed werden ... wie Bestimmen Sie, dass es fehlerhaft ist? Die Zeichenfolge sollte wie utf-8 in ein Unicode-Format hat, das leicht die griechische Zeichenfolge darstellen würde.

Es könnte sein, dass Sie nur die Zeichenfolge nicht die griechischen Schriften müssen repräsentieren?

Wie Darin Dimitrov erklärt, wie ich glaube, dass die Header-Codierung durch einen Fehler in der Klasse HttpWebResponse verursacht wird. Wir haben das gleiche Problem, wo wir ein Cookie an den Header (Set-Cookie) und dieses Cookies enthalten würde Nicht-Ascii-Zeichen hinzufügen wollten. In unserem spesific Fall wäre dies die norwegischen Buchstaben ‚Æ‘, ‚o‘ und ‚A‘ (in der oberen und Kleinbuchstaben). Wir konnten nicht herausfinden, wie die HeaderEncoding Arbeit zu bekommen, aber wir fanden eine Behelfslösung mit Base64-Codierung des Cookies. Beachten Sie, dass dies nur funktioniert, wenn Sie die Kontrolle über den Client und Server-Seite sind (oder Sie können die Verantwortlichen von der Server-Seite Code überzeugen, die Base64-Codierung für Sie hinzufügen ... )

Auf der Serverseite:

var cookieData = "This text contains Norwegian letters; ÆØÅæøå";
var cookieDataAsUtf8Bytes = System.Text.Encoding.UTF8.GetBytes(cookieData);
var cookieDataAsUtf8Base64Encoded = Convert.ToBase64String(cookieDataAsUtf8Bytes);
var cookie = new HttpCookie("MyCookie", cookieDataAsUtf8Base64Encoded);
response.Cookies.Add(cookie);

Auf der Client-Seite:

var cookieDataAsUtf8Bytes = Convert.FromBase64String(cookieDataAsUtf8Base64Encoded);
var cookieData = System.Text.Encoding.UTF8.GetString(cookieDataAsUtf8Bytes);

Beachten Sie, dass cookieDataAsUtf8Base64Encoded auf der Clientseite wird der Datenteil des Cookies (dh 'MyCookie = [data]', wobei 'MyCookie =' wird abgezogen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top