如果您使用默认行为(
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
Cache-control: private
Connection: close
Set-Cookie: BIGipServerpool_webserver_gr=1007732746.36895.0000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
正如我们所看到的,
Location
头包含希腊字符,这些字符没有进行url编码。我不确定这是否符合
HTTP规范。我们可以确定的是,Web浏览器可以正确解释它。
有趣的部分来了。似乎
HttpWebRequest
没有使用UTF-8编码来解析响应头,因为当分析
Location
头时,它会给出:
http://www.site.com/buy/κινηÏή-ÏÏαθεÏή-ÏηλεÏÏνία/c/cn69569/
,这显然是错误的。当它尝试重定向到此位置时,服务器会响应一个新的重定向,直到达到最大重定向次数并抛出异常。
我找不到任何指定
HttpWebRequest
在解析响应头时使用的编码的方法。如果我们手动使用
TcpCLient,则可以完美地运行:
using (var client = new TcpClient())
}
我对这种行为感到非常困惑。有没有办法指定HttpWebRequest
使用的正确编码?也许应该设置一些请求头?
作为解决方法,您可以尝试修改执行重定向的asp
页面并对Location
标头进行urlencode。例如,在ASP.NET应用程序中执行Response.Redirect(location)
时,位置将自动进行HTML编码,并且任何非标准字符都将转换为相应的实体。
例如,如果您执行以下操作:Response.Redirect("http://www.site.com/buy/κινητή-σταθερή-τηλεφωνία/c/cn69569/");
在ASP.NET应用程序中,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并非如此。
HttpWebRequest
会遵循重定向,因此如果服务器发送301/302
状态码,则会发出新请求以使用Location
标头获取资源。因此,一旦获取了最终资源,响应中将不再有Location
标头,所以我想知道为什么loWebResponse.GetResponseHeader("Location")
返回的不是空字符串。另外,您是否使用FireBug
验证了该站点对Location
标头执行正确的编码? - Darin Dimitrov