C#HttpWebResponseのヘッダーエンコーディング
-
19-09-2019 - |
質問
私は、次のような問題があります。私は、301リダイレクトを使用知っているアドレスに連絡します。
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
を使用して
loHttp.AllowAutoRedirect = false;
ように、私はリダイレクトされておりません。
今、私は新しいURLを識別するために、レスポンスのヘッダを取得します。
loWebResponse.GetResponseHeader("Location");
を使用して
問題は、このURLは、ギリシャ語の文字が含まれているため、返される文字列は、すべての(原因エンコーディングに)までごちゃ混ぜにされていることである。
フル画像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
ヘッダーをコードされていないことを意味します。リダイレクトがブラウザで動作していますか?
http://site/Μία_Σελίδα
されている場合、たとえばLocationヘッダーはhttp://site/%CE%95%CE%BD%CE%B9%CE%B1%CE%AF%CE%BF_%CE%94%CE%B5%CE%
のように見える必要があります。
UPDATE:
問題をさらに調査した後、私は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仕様に従って有効である場合、非常にわかりません>。私たちは確かに言うことができますは、Webブラウザがそれを正しく解釈することです。
ここで興味深い部分です。もちろん間違っているHttpWebRequest
を、そしてそれはこの場所にリダイレクトしようとしたときに、サーバーが新しいリダイレクトで応答し、:Location
ヘッダを分析する際に、それが与えるのでhttp://www.site.com/buy/κινηÏή-ÏÏαθεÏή-ÏηλεÏÏνία/c/cn69569/
はレスポンスヘッダを解析するために、UTF-8エンコーディングを使用していないようですようにリダイレクトの最大数に達すると、例外がスローされるまで
私はレスポンスヘッダを解析する際に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エンコードされますし、任意の非標準文字は、対応するエンティティに変換されます。
は、あなたがない場合例: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の場合ではありませんと思われます。
他のヒント
私はどのようにあなたはそれが不正であると判断されている...返される文字列の形式が正しくすることを期待しないでしょうか?ストリングが容易ギリシャ文字列を表現することができるであろうUTF-8などのUnicode形式である必要があります。
それはあなただけの文字列を表現するためにギリシャ語のフォントを持っていないということだろうか?
、Iは、ヘッダ符号化をHttpWebResponseのクラスのバグによって引き起こされると信じています。私たちは、ヘッダにクッキーを追加したい、同じ問題を持っていた(のSet-Cookie)をし、このクッキーは、非ASCII文字を含んでいるでしょう。私たちのspesific場合には、これはノルウェーの手紙「Æ」、「O」と(大文字と小文字で)「A」になります。私たちは、HeaderEncoding
作業を取得する方法を見つけ出すことができませんでしたが、私たちはを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
に留意されたい(つまり、「MyCookie = [データ]」「MyCookie =」が剥離されている)クッキーのデータ部分である。