Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#HttpWebResponse头编码_C#_Encoding_Header_Httpwebresponse - Fatal编程技术网

c#HttpWebResponse头编码

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

我有以下问题。我联系一个我知道使用301重定向的地址

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