2012-11-10 7 views
70

Ich habe den folgenden Code, der erfolgreich funktioniert. Ich kann mir nicht vorstellen, wie ich den Keks aus der Antwort bekomme. Mein Ziel ist, dass ich in der Anfrage Cookies setzen und Cookies aus der Antwort herausholen kann. Gedanken?Kämpfen versucht, Cookie aus der Antwort mit HttpClient in. 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(); 
     } 
    } 

Dies ist die komplette Antwort:

  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

Aus Neugier kann ich fragen, warum Sie Cookies auf dem Client lesen möchten? Nach meinem Verständnis werden Cookies zum Senden von Informationen an den Server und nicht zum Zurücksenden von Informationen verwendet. –

+0

Ich verwende den zurückgegebenen Cookie für Aufrufe, die JSON zurückgeben, sodass ich keinen separaten Autorisierungsaufruf für jeden JSON-Aufruf durchführen muss. Das heißt, ich habe ein Anrufprotokoll/Home/GetData, das JSON zurückgibt, aber nur wenn es autorisiert ist. Auf der Client-Anfrage füge ich das Cookie hinzu, so dass/Home/GetData antworten wird. Andernfalls wird "403" nicht autorisiert. –

+0

Den Autorisierungsheader als Standardheader zu setzen, ist fast genauso effektiv und ein bisschen mehr Standard. Es gibt keine Möglichkeit für den Server, den Auth-Header automatisch für den Client festzulegen. –

Antwort

127

Cookies hinzuzufügen auf eine Anfrage, füllt die Cookie-Container vor der Anforderung mit CookieContainer.Add(uri, cookie). Nachdem die Anfrage gestellt wurde, wird der Cookie-Container automatisch mit allen Cookies aus der Antwort gefüllt. Sie können dann GetCookies() aufrufen, um sie zu retreive.

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

Hinweis: Nach dem Erhalt der ersten Cookies beim ersten Aufruf werden beim Zugriff auf Seiten aus derselben Domäne die Cookies automatisch gesendet und es sind keine weiteren Schritte erforderlich. – Jahmic

Verwandte Themen