2017-01-17 1 views
1

Chrome이 아닌 WebClient를 사용하여 다운로드하려면 다운로드 URL을 가로 챘습니다. 그런 다음 방문자을 사용하여 쿠키를 가져 오는 중에 문제가 발생했습니다. 내가 함락 한 함정은 방문자가 비동기 적으로 실행되고 있다는 것을 이해하지 못했기 때문에 30 %만이 수집 된 쿠키에 너무 일찍 액세스하는 정확한 결과를 얻었습니다.CEFSharp를 사용하여 모든 쿠키를 수집하는 방법은 무엇입니까?

해결책을 찾기 위해 오랫동안 여기에서 데모 코드에서 찾은 것을 붙여 넣기를 원합니다.

답변

2

이것은 내가 발견 한 코드입니다. 기다리고 키워드 나는 중요한 조각 실종된다`VisitAllCookiesAsync` 방법 내장과

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

발생한 된 문제? https://github.com/cefsharp/CefSharp/blob/11dee93bf331f012dd6416fb2f2162549d9137a3/CefSharp/ICookieManager.cs#L54 – amaitland