2012-11-10 13 views
70

Mam następujący kod, który działa poprawnie. Nie mogę wymyślić, jak usunąć ciasteczko z odpowiedzi. Moim celem jest, aby móc ustawić pliki cookie w żądaniu i wycofać pliki cookie z odpowiedzi. Myśli?Próbuję zmusić ciasteczko do odpowiedzi z HttpClient w .net 4.5

private async Task<string> Login(string username, string password) 
    { 
     try 
     { 
      string url = "http://app.agelessemail.com/account/login/"; 
      Uri address = new Uri(url); 
      var postData = new List<KeyValuePair<string, string>> 
           { 
            new KeyValuePair<string, string>("username", username), 
            new KeyValuePair<string, string>("password ", password) 
           }; 

      HttpContent content = new FormUrlEncodedContent(postData); 
      var cookieJar = new CookieContainer(); 
      var handler = new HttpClientHandler 
           { 
            CookieContainer = cookieJar, 
            UseCookies = true, 
            UseDefaultCredentials = false 
           }; 

      var client = new HttpClient(handler) 
            { 
             BaseAddress = address 
            }; 


      HttpResponseMessage response = await client.PostAsync(url,content); 
      response.EnsureSuccessStatusCode(); 
      string body = await response.Content.ReadAsStringAsync(); 
      return body; 
     } 
     catch (Exception e) 
     { 
      return e.ToString(); 
     } 
    } 

Oto pełna odpowiedź:

  HttpResponseMessage response = await client.PostAsync(url,content); 
      response.EnsureSuccessStatusCode(); 

      Uri uri = new Uri(UrlBase); 
      var responseCookies = cookieJar.GetCookies(uri); 
      foreach (Cookie cookie in responseCookies) 
      { 
       string cookieName = cookie.Name; 
       string cookieValue = cookie.Value; 
      } 
+0

Z ciekawości, czy mogę zapytać, dlaczego chcesz czytać pliki cookie na kliencie? Rozumiem, że pliki cookie są używane do wysyłania informacji do serwera, a nie do zwracania informacji. –

+0

Używam zwróconego pliku cookie podczas wywołań, które zwracają JSON, więc nie muszę wykonywać osobnego wywołania autoryzacji dla każdego wywołania JSON. To znaczy, mam dziennik wywołań/Home/GetData, który zwraca JSON, ale tylko jeśli jest autoryzowany. Na żądanie klienta dodaję plik cookie, aby odpowiedzieć/Home/GetData. W przeciwnym razie powie "403" nieautoryzowane. –

+0

Ustawienie nagłówka autoryzacji jako domyślnego nagłówka jest prawie tak samo skuteczne i nieco bardziej standardowe. Serwer nie może automatycznie ustawić nagłówka auth w imieniu klienta. –

Odpowiedz

127

Aby dodać cookies do wniosku, wypełnić pojemnik cookie, zanim wniosek z CookieContainer.Add(uri, cookie). Po wysłaniu żądania pojemnik z ciasteczkami zostanie automatycznie wypełniony wszystkimi plikami cookie z odpowiedzi. Następnie możesz wywołać funkcję GetCookies(), aby je odzyskać.

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

HttpClient client = new HttpClient(handler); 
HttpResponseMessage response = client.GetAsync("http://google.com").Result; 

Uri uri = new Uri("http://google.com"); 
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>(); 
foreach (Cookie cookie in responseCookies) 
    Console.WriteLine(cookie.Name + ": " + cookie.Value); 

Console.ReadLine(); 
+2

Uwaga: Po otrzymaniu pierwszych plików cookie podczas pierwszego połączenia, podczas uzyskiwania dostępu do jakichkolwiek stron z tej samej domeny, pliki cookie będą wysyłane automatycznie, bez dodatkowych czynności. – Jahmic