2012-11-10 8 views
70

私は正常に動作する次のコードを持っています。私はどのように応答からクッキーを取得するのか分かりません。私の目標は、リクエストでクッキーを設定し、クッキーをレスポンスから取り出せるようにすることです。思考?.net 4.5のHttpClientを使用してクッキーを返信しようと苦労しています

  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

なぜ好きではないのですか?クライアントでクッキーを読んでみたいのですが?私の理解は、情報を返すためではなく、サーバーに情報を送信するためにクッキーが使用されることです。 –

+0

JSONを返す呼び出しで返されたCookieを使用するため、JSON呼び出しごとに個別の認証呼び出しを行う必要はありません。つまり、JSONを返すコールログ/ Home/GetDataがありますが、許可されている場合に限ります。クライアントの要求では、/ Home/GetDataが応答するようにCookieを追加します。それ以外の場合は、「403」と表示されます。 –

+0

承認ヘッダーをデフォルトヘッダーとして設定することは、ほぼ効果的でもう少し標準的です。サーバーがクライアントのためにauthヘッダーを自動的に設定する方法はありません。 –

答えて

127

CookieContainer.Add(uri, cookie)と要求する前にクッキーコンテナを移入、リクエストにクッキーを追加するには:ここで

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

は完全な答えです。リクエストが行われた後、クッキーコンテナには自動的にレスポンスのすべてのクッキーが設定されます。その後、GetCookies()を呼び出してそれらを取得することができます。

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

注:最初の呼び出しで最初のCookieを受信した後、同じドメインのページにアクセスすると、Cookieは自動的に送信され、追加の手順は必要ありません。 – Jahmic