c#HttpWebResponse头编码
我有以下问题。我联系一个我知道使用301重定向的地址 使用c#HttpWebResponse头编码,c#,encoding,header,httpwebresponse,C#,Encoding,Header,Httpwebresponse,我有以下问题。我联系一个我知道使用301重定向的地址 使用HttpWebRequest loHttp=(HttpWebRequest)WebRequest.Create(lcUrl) 和loHttp.AllowAutoRedirect=false这样我就不会被重定向 现在,我获取响应的标题以标识新的url 使用lowerResponse.GetResponseHeader(“位置”) 问题是,由于此url包含希腊字符,因此返回的字符串都是混乱的(由于编码) 全图按代码显示: HttpWebReq
HttpWebRequest loHttp=(HttpWebRequest)WebRequest.Create(lcUrl)代码>
和loHttp.AllowAutoRedirect=false代码>这样我就不会被重定向
现在,我获取响应的标题以标识新的url
使用lowerResponse.GetResponseHeader(“位置”)代码>
问题是,由于此url包含希腊字符,因此返回的字符串都是混乱的(由于编码)
全图按代码显示:
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"];
我不希望返回字符串的格式不正确……您如何确定它的格式不正确?字符串应采用类似utf-8的unicode格式,这样可以轻松表示希腊字符串
这可能是因为您没有希腊字体来表示字符串?如果您允许默认行为(loHttp.AllowAutoRedirect=true
)而您的代码不起作用(您没有被重定向到新资源),则表示服务器没有正确编码位置
头。重定向是否在浏览器中工作
例如,如果重定向url为http://site/Μία∑ελΔα
位置头必须看起来像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">
所以我真的对这种行为感到困惑。有没有办法指定HttpWebRequest使用的正确编码?也许应该设置一些请求头
作为一种解决方法,您可以尝试修改执行重定向的asp
页面,并对位置
标题进行URL编码。例如,在ASP.NET应用程序中执行响应.重定向(位置)
时,位置将自动进行html编码,任何非标准字符都将转换为相应的实体
例如,如果您这样做:Response.Redirect(“http://www.site.com/buy/κινητή-σταθερή-τηλελεφωνα/c/cn69569/”
在ASP.NET应用程序中,位置
标题将设置为:
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的情况似乎不是这样。正如Darin Dimitrov解释的那样,我认为头编码是由HttpWebResponse类中的错误引起的。我们遇到了同样的问题,我们想在头中添加一个cookie(Set cookie),而这个cookie将包含非Ascii字符。在我们的特殊情况下,这将是挪威字母“Æ”、“Ø”和“”(大写和小写)。我们不知道如何让HeaderEncoding
工作,但是我们找到了一个解决方法,可以使用cookie的Base64编码注意,只有在您同时控制客户端和服务器端时,这才有效(或者您可以说服负责服务器端代码的人员为您添加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的数据部分(即'mycokie=[data]',其中'mycokie='被剥离)。我所说的格式错误是指不在可读编码中。这就是getResponseHeader在visual studio中返回的“”hmmm它看起来有点不同:S但正如您看到的,中间部分在默认情况下被破坏了HttpWebRequest
将遵循重定向,因此,如果服务器发送301/302
状态代码,将发出一个新请求,使用Location
头获取资源。因此,一旦获取了最后一个资源,响应中将不再有位置
头,因此我想知道LowerResponse.GetResponseHeader(“位置”)
如何返回空字符串以外的任何内容。除此之外,您是否已使用FireBug
验证站点在Location
标题上执行了正确的编码?我没有明确说明'loHttp.AllowAutoRedirect=false;'设置,以便我可以检查重定向URL。如果我将其保留为true,则会出现异常(超时或最大重定向异常)。在浏览器中,它可以很好地到达正确的页面。所以我猜我在阅读位置标题时做错了什么。你有没有可能发布实际的URL,让我看看?或者它不可公开访问?在.Net中,头的解析是用封装在WebHeaderCollection类中的“纯ASCII”编码处理的。这符合RFC 2616的要求。无论是谁分发位置头都是错误的,但是大多数浏览器“只是处理它”,假设字符集是UTF-8(实际的八位字节流中的内容)。
var cookieDataAsUtf8Bytes = Convert.FromBase64String(cookieDataAsUtf8Base64Encoded);
var cookieData = System.Text.Encoding.UTF8.GetString(cookieDataAsUtf8Bytes);