क्या HttpClient का उपयोग करना सुरक्षित है?


151

सभी उदाहरणों में HttpClient, हम इसका उपयोग कर सकते हैं , इसका उपयोग एक बंद कॉल के लिए किया जाता है। लेकिन क्या होगा अगर मेरे पास लगातार ग्राहक की स्थिति है, जहां कई अनुरोध समवर्ती रूप से किए जा सकते हैं? असल में, क्या client.PostAsyncएक ही उदाहरण के खिलाफ एक बार में 2 थ्रेड्स पर कॉल करना सुरक्षित है HttpClient

मैं वास्तव में यहां प्रायोगिक परिणामों की तलाश में नहीं हूं। एक कामकाजी उदाहरण के रूप में बस एक अस्थायी (और उस पर लगातार एक) हो सकता है, और एक असफल उदाहरण एक गलत धारणा मुद्दा हो सकता है। आदर्श रूप से मैं HttpClient में संगामिति हैंडलिंग के सवाल के लिए कुछ आधिकारिक जवाब की तलाश में हूं।


2
HttpClientइसे ठीक से उपयोग करने और निपटाने के तरीके के बारे में अधिक जानकारी के लिए इस प्रश्न को भी पढ़ें : stackoverflow.com/questions/15705092/…
मणि गंधम

जवाबों:


152

MSDN के अनुसार , .NET 4.5 के बाद से निम्न उदाहरण तरीके थ्रेड सुरक्षित हैं (धन्यवाद @ मिस):

CancelPendingRequests
DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync

3
हाँ, मुझे उस बारे में निश्चित नहीं था, क्योंकि यह MSDN पर हर चीज़ पर एक मानक चेतावनी प्रतीत होता है (और मुझे याद है कि कुछ MSDN ब्लॉगों को पढ़ना कुछ समय के लिए है कि चेतावनी गलत है, क्योंकि यह सब कुछ आँख बंद करके लागू होता है)।
एलेक्स के

3
ये गलत है; आपके द्वारा लिंक किए गए MSDN पृष्ठ की टिप्पणी अनुभाग में, यह कहता है कि GetAsync, PostAsync, आदि सभी थ्रेड सुरक्षित हैं।
30

4
@ मिसकॉल: मैं आपको आश्वस्त कर सकता हूं कि जिस समय इस मुद्दे पर चर्चा की गई थी, उस समय प्रश्न में पैराग्राफ नहीं था।
मार्सेल एन।

7
इसलिए Microsoft ने HttpClient को पुन: प्रयोज्य बनाने के लिए डिज़ाइन किया है, लेकिन तब वर्ग हेडर के लिए उदाहरण डेटा है: client.DefaultRequestHeaders.Accept.Add (...);
cwills

8
देर से, लेकिन मैं @cwills पर टिप्पणी करना चाहता था। DefaultRequestHeaders बस यही हैं, चूक। यदि आप प्रति-अनुरोध के आधार पर अलग-अलग हेडर चाहते हैं, तो आप नया StringContent () बना सकते हैं, उस पर अतिरिक्त हेडर सेट कर सकते हैं, फिर उस ओवरलोड का उपयोग करें जो URI और HttpContent लेता है।
रयान एंडरसन

92

यहाँ हेनरिक एफ नील्सन का एक और लेख है HttpClient के बारे में जहाँ वे कहते हैं:

" डिफ़ॉल्ट HttpClient सबसे सरल तरीका है जिसमें आप अनुरोध भेजना शुरू कर सकते हैं। एक HttpClient का उपयोग कई HTTP अनुरोधों को भेजने के लिए किया जा सकता है क्योंकि आप समवर्ती रूप से बहुत सारे परिदृश्य चाहते हैं ताकि आप बस एक HttpClient बना सकें और फिर अपने सभी अनुरोधों के लिए उपयोग कर सकें। । "


13
यदि उपयोगकर्ता नाम और पासवर्ड धागे के बीच बदल सकते हैं तो क्या होगा? यही कारण है कि मुझे लगता है कि किसी को भी इसके बारे में बात करते हुए नहीं मिल सकता है
निकोलस डिपियाज़ा

1
@ निकोलसडिपियाजा: यह कितनी बार बदलता है? यदि उपयोगकर्ता / पासवर्ड जोड़े का एक ज्ञात सेट है तो आप HttpClient उदाहरणों का एक पूल बना सकते हैं।
मार्सेल एन।

हां, यही मैंने खत्म कर दिया
निकोलस डिपियाज़ा

2
ध्यान दें कि आपके सभी अनुरोधों के लिए एक ही HttpClient का पुनः उपयोग करने से बासी DNS समस्याएं हो सकती हैं: github.com/dotnet/corefx/issues/11224
ओहद श्नाइडर

1
@OhadSchneider यदि विश्वास है कि मुद्दा .net कोर तक सीमित है। आप .net 4 के साथ समस्या को ठीक कर सकते हैं। एक कस्टम HttpClientHandler को HttpClient कंस्ट्रक्टर में इंजेक्ट करके "कनेक्शनलीज़टाइम" सेट कर सकते हैं। हालांकि, अगर 100 सेकंड के लिए समापन बिंदु पर कोई अनुरोध नहीं भेजा जाता है, तो कनेक्शन अपने आप ताज़ा हो जाएगा। संरक्षित ओवरराइड टास्क <HttpResponseMessage> SendAsync (HttpRequestMessage अनुरोध, रद्द करने के लिए टोकन रद्द करें): {var sp = ServicePointManager.FindServicePoint (request.RequestUri); sp.ConnectionLeaseTimeout = 100 * 1000; }
टिमोथी गोंजालेज

17

हेनरिक एफ। नील्सन (HttpClient के प्रमुख आर्किटेक्ट्स में से एक) द्वारा एक MSDN फोरम पोस्ट मिला ।

त्वरित सारांश:

  • यदि आपके पास अनुरोध हैं जो संबंधित हैं (या प्रत्येक अभिभावक पर कदम नहीं उठाएंगे) तो उसी HttpClient का उपयोग करने से बहुत कुछ समझ में आता है।
  • मूल रूप में मैं HttpClient उदाहरणों का यथासंभव उपयोग करने की सलाह दूंगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.