2017-01-17 3 views
1

ChromeではなくWebClientを使用してダウンロードを行うために、ダウンロードURLを傍受しました。その後、訪問者を使用してCookieを取得する際に問題が発生しました。私が落とした落とし穴は、ビジターが非同期で実行されていることを理解できず、したがって、30%のケースでのみ、収集されたクッキーに早すぎるアクセスが正しい結果を得ただけです。CEFSharpを使ってすべてのクッキーを収集するには?

私はかなり長い間、デモコードで見つかったものを貼りたいと思います。

答えて

2

これは私が見つけたコードです。 キーワードは、私が行方不明になった重要な部分である待つ:

class CookieCollector : ICookieVisitor 
{ 
    private readonly TaskCompletionSource<List<Cookie>> _source = new TaskCompletionSource<List<Cookie>>(); 

    public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie) 
    { 
     _cookies.Add(cookie); 

     if (count == (total - 1)) 
     { 
      _source.SetResult(_cookies); 
     } 

    } 

    // https://github.com/amaitland/CefSharp.MinimalExample/blob/ce6e579ad77dc92be94c0129b4a101f85e2fd75b/CefSharp.MinimalExample.WinForms/ListCookieVisitor.cs 
    // CefSharp.MinimalExample.WinForms ListCookieVisitor 

    public Task<List<Cookie>> Task => _source.Task; 

    public static string GetCookieHeader(List<Cookie> cookies) 
    { 

     StringBuilder cookieString = new StringBuilder(); 
     string delimiter = string.Empty; 

     foreach (var cookie in cookies) 
     { 
      cookieString.Append(delimiter); 
      cookieString.Append(cookie.Name); 
      cookieString.Append('='); 
      cookieString.Append(cookie.Value); 
      delimiter = "; "; 
     } 

     return cookieString.ToString(); 
    } 

    private readonly List<Cookie> _cookies = new List<Cookie>(); 
    public void Dispose() 
    { 
    } 
} 

// usage: 
void foo() 
{ 
    var cookieManager = Cef.GetGlobalCookieManager(); 
    var visitor = new CookieCollector(); 

    cookieManager.VisitUrlCookies(targetUrl, true, visitor); 

    var cookies = await visitor.Task; // AWAIT !!!!!!!!! 
    var cookieHeader = CookieCollector.GetCookieHeader(cookies); 
} 
+0

あなたは 'VisitAllCookiesAsync'方法で構築されたとの問題を経験していましたか? https://github.com/cefsharp/CefSharp/blob/11dee93bf331f012dd6416fb2f2162549d9137a3/CefSharp/ICookieManager.cs#L54 – amaitland

関連する問題