2012-11-10 12 views
70

Aşağıdaki kod başarılı bir şekilde çalışıyor. Çerezi cevaptan nasıl çıkaracağımı anlayamıyorum. Amacım, istekte çerezleri ayarlayabilmem ve çerezleri yanıttan çıkarabilmem. Düşünceler?HttpClient öğesinde .net ile yanıttan çıkarılmaya çalışılıyor.

  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

Merak etme, neden istemcideki çerezleri okumak istediğinizi sorabilir miyim? Anlayışım, çerezlerin bilgi vermek için değil, sunucuya bilgi göndermek için kullanılmalarıdır. –

+0

İade edilen çerezi, JSON'a geri dönen aramalarda kullanırım, böylece her JSON araması için ayrı bir yetkilendirme çağrısı yapmak zorunda kalmam. Yani JSON'u döndüren ancak yalnızca yetkilendirilmiş bir çağrı günlüğü/Home/GetData'm var. Müşteri isteğinde,/Home/GetData'nın yanıt vermesi için çerezi ekledim. Aksi takdirde "403" yetkisiz olarak söylenir. –

+0

Yetkilendirme üstbilgisini varsayılan başlık olarak ayarlamak neredeyse etkili ve biraz daha standarttır. Sunucunun auth başlığını otomatik olarak istemci adına ayarlaması için bir yol yoktur. –

cevap

127

CookieContainer.Add(uri, cookie) isteğe önce bir istek çerez eklemek çerez kabı doldurmak için:

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(); 
     } 
    } 

İşte tam cevaptır. İstek yapıldıktan sonra çerez kutusu otomatik olarak cevabın tüm çerezleri ile doldurulur. Daha sonra onları geri almak için GetCookies() öğesini arayabilirsiniz.

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

Not: İlk çağrıda ilk çerezleri aldıktan sonra, aynı etki alanından herhangi bir sayfaya erişirken, çerezler otomatik olarak gönderilir, ek adım gerekmez. – Jahmic