2012-09-11 35 views

Trả lời

248

Đây là cách bạn có thể đặt một giá trị cookie tùy chỉnh cho các yêu cầu:

var baseAddress = new Uri("http://example.com"); 
var cookieContainer = new CookieContainer(); 
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) 
{ 
    var content = new FormUrlEncodedContent(new[] 
    { 
     new KeyValuePair<string, string>("foo", "bar"), 
     new KeyValuePair<string, string>("baz", "bazinga"), 
    }); 
    cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value")); 
    var result = client.PostAsync("/test", content).Result; 
    result.EnsureSuccessStatusCode(); 
} 
+0

trình xử lý có thể bị xóa khỏi sử dụng câu lệnh, trình xử lý sẽ được xử lý khi máy khách http được xử lý. – Kimi

+7

Kimi là chính xác, nhưng bạn cũng không nên bọc HttpClient của bạn trong một sử dụng. http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – AdvancedREI

+3

THẬN TRỌNG: nếu bạn chỉ sử dụng 1 phiên bản của HttpClient để thực hiện một số yêu cầu, cookie sử dụng CookieContainer sẽ được lưu vào bộ nhớ cache. Nguy hiểm cho người dùng nhận cookie từ một người dùng khác. –

211

Các accepted answer là cách chính xác để làm điều này trong nhiều trường hợp. Tuy nhiên, có một số tình huống mà bạn muốn đặt tiêu đề cookie theo cách thủ công. Thông thường, nếu bạn đặt tiêu đề "Cookie", nó sẽ bị bỏ qua, nhưng đó là vì mặc định là HttpClientHandler để sử dụng thuộc tính CookieContainer cho cookie. Nếu bạn vô hiệu hóa điều đó sau đó bằng cách đặt UseCookies thành false, bạn có thể đặt tiêu đề cookie theo cách thủ công và chúng sẽ xuất hiện trong yêu cầu, ví dụ:

var baseAddress = new Uri("http://example.com"); 
using (var handler = new HttpClientHandler { UseCookies = false }) 
using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) 
{ 
    var message = new HttpRequestMessage(HttpMethod.Get, "/test"); 
    message.Headers.Add("Cookie", "cookie1=value1; cookie2=value2"); 
    var result = await client.SendAsync(message); 
    result.EnsureSuccessStatusCode(); 
} 
+22

Tôi đã theo dõi trong vài ngày lỗi trong đó các yêu cầu được gửi cùng với SendAsync không gửi tiêu đề cookie; điều này đã giúp tôi nhận ra rằng, trừ khi bạn đặt UseCookies = false trong Trình xử lý, nó sẽ không chỉ sử dụng CookieContainer, mà còn bỏ qua bất kỳ Cookie nào được lưu trữ trong các tiêu đề yêu cầu! Cảm ơn bạn rất nhiều! –

+0

Cảm ơn bạn, đó là những gì tôi muốn! –

+7

Câu trả lời này cực kỳ hữu ích cho bất kỳ ai đang cố gắng sử dụng HttpClient như một proxy! – cchamberlain

Các vấn đề liên quan