我有以下问题。我联系我知道地址采用301重定向。

使用HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);

loHttp.AllowAutoRedirect = false;使得我不重定向。

现在我得到,以便识别新的URL的响应的报头中。

使用loWebResponse.GetResponseHeader("Location");

的问题是,由于该网址包含希腊字符返回的字符串已混在一起(由于编码)。

在全貌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"];
有帮助吗?

解决方案

如果你让默认的行为(loHttp.AllowAutoRedirect = true)和你的代码不工作(你不重定向到新的资源),这意味着服务器无法正确编码Location头。在浏览器中工作的重定向?

例如,如果重新定向URL http://site/Μία_Σελίδα Location头必须看起来像http://site/%CE%95%CE%BD%CE%B9%CE%B1%CE%AF%CE%BF_%CE%94%CE%B5%CE%


更新:

在进一步调查我开始怀疑有东西的奇怪的与HttpWebRequest问题。当发送请求的服务器发送以下响应:

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">

正如我们可以看到的Location头包含未URL编码希腊字符。我不太肯定这是否根据 HTTP规范有效。我们可以肯定地说是一个网络浏览器能够正确地解释它。

下面了有趣的部分。看来,HttpWebRequest不使用UTF-8编码解析响应报头,因为分析Location头时,它提供:http://www.site.com/buy/κινηÏή-ÏÏαθεÏή-ÏηλεÏÏνία/c/cn69569/,这当然是错误的,当它试图重定向到该位置的服务器用新的重定向响应,依此类推,直到达到重定向的最大数量和则抛出异常。

我找不到任何方法来指定解析响应标头时所使用HttpWebRequest的编码。如果我们使用的TcpClient 手动将其工作完全正常:

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/
    }
}

所以,我真的被这种行为感到不解。有什么办法来指定HttpWebRequest使用正确的编码?也许有些请求头应设置?

作为一种解决方法可以尝试修改执行重定向的asp页和URLEncode的所述Location报头。例如,当在ASP.NET应用程序在执行Response.Redirect(location),该位置将被自动HTML编码并且任何非标准字符将被转换为它们的相应的实体。

例如,如果你:在ASP.NET应用程序Response.Redirect("http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/");Location头将被设置为:

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

看来,这是不与传统的ASP的情况。

其他提示

我不希望返回的字符串被畸形的...你是如何确定它的格式不正确?该字符串应该是在一个unicode格式像UTF-8,从而能够容易地表示希字符串。

这可能是因为你根本没有希腊的字体来表示字符串?

如达林Dimitrov的解释,相信标题编码是通过在HttpWebResponse类的错误引起的。我们有我们想要一个cookie添加到页眉(设置Cookie)和此cookie将包含非ASCII字符相同的问题。在我们的spesific情况下,这将是挪威字母“Æ”,“O”和“A”(大写和小写)。我们无法弄清楚如何获得HeaderEncoding工作,但我们发现的的Base64编码一个变通使用的cookie。 请注意,如果您在客户端和服务器端两者的控制是这只会工作(或者你能说服人负责服务器端代码添加Base64编码为你的... )

在服务器侧:

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);

在客户端:

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

请注意在客户端侧即cookieDataAsUtf8Base64Encoded是cookie的数据部分(也就是“的myCookie = [数据]”,其中“的myCookie =”被剥离)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top