2012-09-11 9 views
150

मैं वेब एपीआई HttpClient उपयोग करने के लिए एक अंत बिंदु है कि एक HTTP कुकी है कि एक खाते की पहचान के रूप में प्रवेश करना पड़ता है के लिए एक पोस्ट करने के लिए (यह केवल कुछ है कि है #ifdef है कोशिश कर रहा हूँ सेट करना रिलीज संस्करण से बाहर ')।मैं कैसे HttpClient के HttpRequestMessage पर एक कुकी

मैं HttpRequestMessage पर कुकी कैसे जोड़ूं?

उत्तर

248

यहाँ कैसे आप अनुरोध के लिए एक कस्टम कुकी मान सेट कर सकते हैं:

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

हैंडलर को कथन का उपयोग करने से हटाया जा सकता है, जब http क्लाइंट का निपटारा किया जाता है तो इसका निपटान किया जाएगा। – Kimi

+7

किमी सही है, लेकिन आपको अपने एचटीपी क्लाइंट को उपयोग में लपेटना नहीं चाहिए। http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – AdvancedREI

+3

सावधानी: यदि आप कई अनुरोध करने के लिए HttpClient के केवल 1 उदाहरण का उपयोग करते हैं, तो कुकी कोंटेनर का उपयोग कर कुकीज़ कैश जा रही है। किसी उपयोगकर्ता के लिए खतरनाक है किसी अन्य उपयोगकर्ता से कुकी प्राप्त करें। –

211

accepted answer ज्यादातर मामलों में यह करने के लिए सही तरीका है। हालांकि, कुछ स्थितियां हैं जहां आप कुकी हेडर मैन्युअल रूप से सेट करना चाहते हैं। आम तौर पर यदि आप "कुकी" हेडर सेट करते हैं तो इसे अनदेखा किया जाता है, लेकिन ऐसा इसलिए है क्योंकि HttpClientHandler कुकीज़ के लिए CookieContainer संपत्ति का उपयोग करने के लिए डिफ़ॉल्ट है। यदि आप इसे UseCookies से false पर सेट करके अक्षम करते हैं तो आप कुकी हेडर मैन्युअल रूप से सेट कर सकते हैं और वे अनुरोध में दिखाई देंगे, उदा।

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

मैं कई दिनों तक एक त्रुटि का पीछा कर रहा हूं जिसमें SendAsync के साथ भेजे गए अनुरोध कुकी हेडर नहीं भेजा; इससे मुझे एहसास हुआ कि, जब तक आप हैंडलर में UseCookies = false सेट नहीं करते हैं, यह न केवल कुकी कंटनर का उपयोग करेगा, बल्कि अनुरोध हेडर में संग्रहीत किसी भी कुकी को भी अनदेखा कर देगा! आपको बहुत - बहुत धन्यवाद! –

+0

धन्यवाद, मैं यही चाहता था! –

+7

यह उत्तर किसी भी व्यक्ति के लिए प्रॉक्सी के रूप में HttpClient का उपयोग करने का प्रयास करने में बेहद सहायक है! – cchamberlain

संबंधित मुद्दे