2011-07-06 2 views
2

live.comにログインするアプリケーションを作成しています。私は既にこれをWebBrowserコントロールでうまく実装しましたが、今はヘッドレスブラウザでこれを行うようにしています。私はSimpleBrowserを使うだけですが、JavaScriptをサポートする必要があります。だから、WebClientクラスを拡張してクッキーをサポートすることで、これを実行しようとしています。私はもともと私の問題だと思っていましたが、HttpWebRequestとHttpWebResponseオブジェクトで簡単なテストケースを実行して、クッキーがどのように見えるかを確認しました。同じ結果が得られました。バージョンが応答で設定されている場合、CookieContainerオブジェクトの予期しない動作Set-Cookie C#.NET 2.0-4.0

問題は、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" の値を見れば、これは私が(バイオリンからつかんで)見たものである。

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つのテストケースの間にそれ以外の大きな違いは見られません。

おかげで、
アーロン・レイ

+0

ラフ操作(があるように思われるので、Webブラウザーコンポーネントを使用していないため、あなたの理由は何ですかHttpWebRequestとHttpWebResponseを使って処理すると時間がかかります)、フィドラーのようにlive.comに接続するとどうなりますか? – cgon

+0

WebBrowserオブジェクトはFormsコントロールです。基本的にMSHTMLのラッパーです。私は、HTMLのレンダリングを心配せず、生データを取得/送信するだけで、ヘッドレスソリューションを実装したいと考えています。私もWPFで実装しようとしています.PFormホストでWPF WebBrowserとForms WebBrowserを使用しているので、Forms WebBrowserを実行しています。 –

+0

表示される遅延は、おそらく、HttpRequest.Proxy設定のプロキシによるものです。それをオフにすると、Fiddlerでは何も表示されませんが、接続速度が向上します。それにもかかわらず、私のここでの問題は、この「すべき」が機能することですが、そうではありません。 CookieContainerの処理バージョンに固有の問題、またはその実装上の問題があるようです。 –

答えて

2

は、バージョン部分を削除するには、次のようなコードを使用することができます:

foreach (Cookie c in cookieContainer.GetCookies(new Uri(uri))) 
{ 
    c.Version = 0; 
} 
+0

これはバージョンを削除しますが、パスのクッキーを切り捨てます。私はGUIDの行が必要で、コードはそれを取得できません。 –

関連する問題