Search code examples
c#cookiesasync-awaitwebclient

Get response cookies after WebClient.UploadStringTaskAsync


After overloading the WebClient class

public class CustomWebClient : WebClient
{
    public CustomWebClient()
    {
        Cookies = new CookieCollection();
        CookieContainer = new CookieContainer();
    }

    public CookieContainer CookieContainer { get; }
    public CookieCollection Cookies { get; private set; }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = (HttpWebRequest)base.GetWebRequest(address);
        
        request.CookieContainer = CookieContainer;

        return request;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        var response = (HttpWebResponse)base.GetWebResponse(request);
        
        Cookies = response.Cookies;

        return response;
    }
}

I can get cookies using the client.UploadString

public string Test()
{
    using (var client = new CustomWebClient())
    {
        //...

        client.UploadString("example.com", "json");

        return client.Cookies
    }
}

But how can I get cookies using the client.UploadStringTaskAsync?

public async Task<string> Test()
{
    using (var client = new CustomWebClient())
    {
        //...

        await client.UploadStringTaskAsync("example.com", "json");

        return client.Cookies // There are no cookies!
    }
}

Do you feel the need for more explanation?
Because the stackoverflow warns that:
It looks like your post is mostly code; please add some more details.


Solution

  • I solved this problem by overriding the GetWebResponse(WebRequest request, IAsyncResult result)

    public class CustomWebClient : WebClient
    {
        public CustomWebClient()
        {
            Cookies = new CookieCollection();
            CookieContainer = new CookieContainer();
        }
    
        public CookieContainer CookieContainer { get; }
        public CookieCollection Cookies { get; private set; }
    
        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = (HttpWebRequest)base.GetWebRequest(address);
            
            request.CookieContainer = CookieContainer;
    
            return request;
        }
    
        protected override WebResponse GetWebResponse(WebRequest request)
        {
            var response = (HttpWebResponse)base.GetWebResponse(request);
            
            Cookies = response.Cookies;
    
            return response;
        }
    
        protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
        {
            var response = (HttpWebResponse)base.GetWebResponse(request);
    
            Cookies = response.Cookies;
    
            return response;
        }
    }