live.comにログインするためのアプリケーションを作成しています。私はすでにWebBrowserコントロールを使用してこれを正常に実装しましたが、現在、ヘッドレスブラウザーを使用してこれを実行しようとしています。SimpleBrowserを使用するだけですが、JavaScriptのサポートが必要です。だから私はCookieをサポートするようにWebClientクラスを拡張することによってこれを行おうとしています。もともとはそれが私の問題だと思っていましたが、HttpWebRequestオブジェクトとHttpWebResponseオブジェクトを使用して簡単なテストケースを実行し、Cookieがどのように表示されるかを確認しました。同じ結果が得られました。
この問題は、live.comのSet-Cookie応答ヘッダーで渡された「version=1」が原因のようです。私のテストケースでは、twitter.comとlogin.live.comに対して同じコードを実行しました。
private void printCookies(string url)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); ;
CookieContainer cc = new CookieContainer();
req.CookieContainer = cc;
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
if (res.Cookies != null && res.Cookies.Count != 0)
{
Console.WriteLine("--------" + url + "--------");
foreach (Cookie c in res.Cookies)
{
Console.WriteLine(c.ToString());
}
}
res.Close();
}
出力:
--------https://login.live.com--------
$Version=1; MSPRequ=lt=1309969317&co=1&id=251248; $Path=/
--------http://twitter.com--------
k=209.43.1.25.1309969317382762
guest_id=v1%3A130996931741841563
auth_token= _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCC5%252BQQAxAToHaWQiJWNmZWM0ZTAyNmEyMWYx%250ANDg0MTM3YzJhZGRiZTljYmI2IgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--e08b33494bd0d4d688020d4c875f69a1192e2a84
それぞれのURLの応答ヘッダーにある「Set-Cookie」値を見ると、これが表示されます(Fiddlerから取得)。
login.live.com
Set-Cookie: MSPRequ=lt=1309969336&co=1&id=251248; path=/;version=1
Set-Cookie: MSPOK=$uuid-9f7c6cd2-5acc-497f-a634-079d78cb6e7f; domain=login.live.com;path=/;version=1
twitter.com
Set-Cookie: k=209.43.1.25.1309969337110139; path=/; expires=Wed, 13-Jul-11 16:22:17 GMT; domain=.twitter.com
Set-Cookie: guest_id=v1%3A130996933711260520; domain=.twitter.com; path=/; expires=Sat, 06 Jul 2013 04:22:17 GMT
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCBrLQQAxAToHaWQiJTZhZTNjNmRmNjlhNWJl%250AMWEyMzkyZjNjNWQ4MjRmNDAxIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--2af4da7176dc0ee77c8379bc31a85c0301823e2d; domain=.twitter.com; path=/; HttpOnly
したがって、login.live.comはCookieの1つだけを取得し、バージョンとパスを別々に保存します。twitter.comリクエストは期待どおりに機能しています(重複したauth_tokenが送信される理由はわかりませんが、CookieContainerはそれを適切に処理します)。
これは予想される動作ですか?IE、Firefox、Chromeは「version = 1」を無視しているようです(Fiddlerでわかることから)。カスタムWebClientクラスのGetWebResponseメソッドをオーバーライドして、応答ヘッダーの「Set-Cookie」値から「version = 1」を削除することもできますが、欠落しているより明白な解決策があることを期待していました。「version=1」のせいではないかもしれませんが、2つのテストケース以外に目立った違いは見られません。
ありがとう、
アーロン・レイ