簡體   English   中英

c#HttpWebResponse頭編碼

[英]c# HttpWebResponse Header encoding

我有以下問題。 我聯系了一個我知道使用301重定向的地址。

使用HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); loHttp.AllowAutoRedirect = false; 這樣我就不會被重定向了。

現在我得到響應的標題以識別新的URL。

使用loWebResponse.GetResponseHeader("Location");

問題是,由於此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"];

如果您使用默認行為( loHttp.AllowAutoRedirect = true )並且您的代碼不起作用(您沒有被重定向到新資源),則意味着服務器未正確編碼Location標頭。 重定向是否在瀏覽器中工作?

例如,如果重定向網址為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/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頁面並對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的情況。

我不希望返回字符串格式錯誤......你如何確定它是否格式錯誤? 該字符串應采用unfode格式,如utf-8,可以很容易地表示希臘字符串。

可能你只是沒有希臘字體來代表字符串?

正如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的數據部分(即'MyCookie = [data]',其中'MyCookie ='被刪除)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM