2

I work on a Xamarin.Forms project where I call some WebServices that using cookies, as they was intially made for a website. There are some webservices that only return cookies, but ohers need to receive cookies for working well.

For example, the Login webservice gets a JSON and returns 2 cookies, while the Logout webservice gets an "empty" JSON, the 2 previous cookies and must return an updated value for one of these cookies.

I based on the following link to manage cookies with HttpClient: Struggling trying to get cookie out of response with HttpClient in .net 4.5

My problem is that I can send a cookie to a webservice, I can receive the returned cookie by a webservice, but I can't receive any "updated" cookie if I've sent it before the call...

The code of the call to the Login webservice looks like this:

public async Task Login()
{
    Uri uri = new Uri("http://www.website.com/Login");

    CookieContainer cookies = new CookieContainer();
    HttpClientHandler handler = new HttpClientHandler();
    handler.CookieContainer = cookies;

    var httpClient = new HttpClient(handler);

    var jsonParam = "{\"data\":{\"device\":\"xxx\",\"login\":\"my@email.com\",\"password\":\"password\"}}";

    HttpContent httpContent = new StringContent(jsonParam);
    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    httpClient.DefaultRequestHeaders.Add("X-HTTP-Method-Override", "PUT");
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    try
    {
        HttpResponseMessage httpResponse = httpClient.PostAsync(uri), httpContent).Result;
        //Treatment of the recovered cookies
        IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
        foreach (Cookie cookie in responseCookies)
        {
            Debug.WriteLine(cookie.Name + " : " + cookie.Value);
            wsCookies.Add(new KeyValuePair<string, string>(cookie.Name, cookie.Value));
        }

        if (httpResponse.IsSuccessStatusCode)
        {
            var responseText = await httpResponse.Content.ReadAsStringAsync();
        }
    }
    catch (Exception e)
    {

    }
}

=> it works well: I get the expected cookies: SESSIONID=xxx and USERID=xxx

The code of my Logout method looks like this:

public async Task Logout(String test)
{
    Uri uri = new Uri("http://www.website.com/Logout");

    CookieContainer cookies = new CookieContainer();
    HttpClientHandler handler = new HttpClientHandler();
    handler.CookieContainer = cookies;

    var httpClient = new HttpClient(handler);

    var jsonParam = "{\"data\":{}}";

    HttpContent httpContent = new StringContent(jsonParam);
    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    httpClient.DefaultRequestHeaders.Add("X-HTTP-Method-Override", "GET");
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    //Retrieving cookies to send
    foreach (KeyValuePair<string, string> kvpCookie in wsCookies)
    {
        cookies.Add(uri, new Cookie(kvpCookie.Key, kvpCookie.Value));
    }

    try
    {
        HttpResponseMessage httpResponse = httpClient.PostAsync(uri, httpContent).Result;
        //Treatment of the recovered cookies
        IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
        foreach (Cookie cookie in responseCookies)
        {
            Debug.WriteLine(cookie.Name + " : " + cookie.Value);
            wsCookies.Add(new KeyValuePair<string, string>(cookie.Name, cookie.Value));
        }

        if (httpResponse.IsSuccessStatusCode)
        {
            var responseText = await httpResponse.Content.ReadAsStringAsync();
        }
    }
    catch (Exception e)
    {

    }
}

=> this method works but I don't get the expected cookies. I send the cookies (names and values) that I've received earlier (SESSIONID=xxx and USERID=xxx), but I don't get a new value for the cookies, whereas I wait USERID=deleted as I can see when I sniff it in Fiddler: I only find the 2 cookies I've sent in "responseCookies"...

=> Do you have an explanation? Is there something that I'm doing wrong? Is there another way to manage webservices and cookies?

Community
  • 1
  • 1
Gold.strike
  • 1,269
  • 13
  • 47

1 Answers1

0

Not sure if that is the issue, but why create the cookie container every time? You can pass the cookies along every time.

So initialize once, and then assign the existing cookie container to the requests in Login and Logout.

Patrick Hofman
  • 153,850
  • 22
  • 249
  • 325
  • Can you give more details or a link about your suggestion? I'm not very familiar with the CookieContainer, but in each sample that I've found, they used something like this. between the webservices, but it's probably not the best approach. – Gold.strike Apr 08 '16 at 12:49