System.Net.Http बनाम Microsoft.Net.Http


86

मैं ASP.NET कोर का उपयोग कर रहा हूं। मैं उपयोग करना चाहता हूं HttpClientलेकिन मैंने देखा कि दो NuGet पैकेज दिए जा रहे हैं। मैं किसका उपयोग करूं?


ऐसा लगता है कि System.Net.Httpपर निर्भर करता है Microsoft.Net.Http। लेकिन फिर, यह इस बात पर निर्भर करता है कि आप अपने आवेदन के साथ क्या करने की कोशिश कर रहे हैं।
जॉन ओडम

जवाबों:


64

संस्करण पर निर्भर करता है। पुराने System.Net.Httpपैकेज ( 2.0 वाले) विरासत पैकेज हैं जो Microsoft.Http.Netविवरण के अनुसार हटाए गए हैं :

विरासत पैकेज, System.Net.Http अब 'Microsoft.Net.Http' पैकेज में शामिल है।

वे HttpClientपिछले .NET संस्करणों और पोर्टेबल क्लास पुस्तकालयों में प्रदान करने के लिए मौजूद हैं। आपको Microsoft.Net.Httpउस स्थिति में उपयोग करना चाहिए ।

जब से आप .NET कोर का उपयोग कर रहे हैं, आपको नवीनतम System.Net.Httpपैकेज (उदाहरण। 4.3.3) का उपयोग करना चाहिए ।

Csproj के लिए अद्यतन किया गया

.NET मानक 2.0 के अनुसार, System.Net.HttpClientजब आप लक्ष्य बनाते हैं तो पैकेज पहले से ही शामिल होता है और उपलब्ध होता है netstandard2.0। यदि, किसी कारण से, आप अभी भी इसे पूर्ण .NET और .NET कोर दोनों के लिए संदर्भित करना चाहते हैं, तो आप इसे अपनी csproj फ़ाइल में जोड़ सकते हैं:

<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <!-- // HttpClient for full .NET -->
    <Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <!-- // HttpClient for .NET Core -->
    <PackageReference Include="System.Net.Http" Version="4.3.3" />
</ItemGroup>

यदि आप project.json का उपयोग कर रहे हैं

यदि आपका प्रोजेक्ट। Json पूर्ण .NET और .NET कोर दोनों को लक्षित करता है, तो आपको System.Net.Httpअसेंबली को frameworkAssembliesतत्व में जोड़ना होगा । उदाहरण के लिए:

"frameworks": {
  "net451": {
    "frameworkAssemblies": {
      "System.Net.Http": "4.0.0.0" // HttpClient for full .NET
    }
  },
  "netstandard1.3": {
    "dependencies": {
      "System.Net.Http": "4.1.0", // HttpClient for .NET Core
    }
  }
}

1
इस बात से अवगत रहें कि उनके पास ठीक वैसा ही व्यवहार नहीं है। पूर्ण .NET संस्करण (4.0.0.0) स्वचालित संपीड़न नहीं करता है, जबकि .NET कोर संस्करण (4.1.0) करता है। इसलिए यदि आप पूर्ण .NET संस्करण का उपयोग करते हैं तो आपको मैन्युअल रूप से हैंडलर को gzip / deflate कम्प्रेशन का उपयोग करने के लिए कॉन्फ़िगर करना होगा। विवरण: github.com/dotnet/docs/issues/1054
जेपी एंडरसन

28
यह उत्तर यह बताता है कि यह .NET कोर, .NET स्टैंडर्ड और .NET फ्रेमवर्क के साथ क्या गड़बड़ है।
विंसेंट

1
@ इवनेंट यह गधे की पीठ का दर्द नहीं है जब लोग मोनो आदि का इस्तेमाल करते हैं। मल्टी प्लेटफॉर्म में हमेशा कुछ दर्द होता है।
रोल

4
मैं "विरासत पैकेज नहीं देखता, System.Net.Httpअब Microsoft.Net.Httpपैकेज में शामिल है ।" पैकेज विवरण में आप जिस भाषा का उल्लेख कर रहे हैं। वास्तव में, System.Net.Httpपैकेज सबसे हाल ही में अद्यतन किया गया प्रतीत होता है (कई वर्षों से)
दान एस्परजा

2
@DanEsparza यदि आप मेरे द्वारा पोस्ट किए गए लिंक को देखेंगे तो आपको संदेश दिखाई देगा। मैंने यह भी उल्लेख किया है कि केवल पुराने पैकेज (2.0 वाले) पदावनत हैं। नवीनतम 4.xx पैकेज वास्तव में सबसे नए हैं और आपको उनका उपयोग करना चाहिए।
हेन्क मोल्लेमा

19

इससे अधिक पृष्ठभूमि में रुचि रखने वाले किसी व्यक्ति के लिए, इममो लैंडवर्थ (माइक्रोसॉफ्ट में .NET पर प्रोग्राम मैनेजर) ने इस बारे में ट्वीट किया :

"HttpClient एक NuGet पैकेज (आउट-ऑफ-बैंड) के रूप में शुरू हुआ था और इसे .NET फ्रेमवर्क में 4.5 के साथ-साथ (इन-बॉक्स) में जोड़ा गया था।

.NET कोर / .NET मानक के साथ, हमने मूल रूप से .NET प्लेटफ़ॉर्म को पैकेज के एक सेट के रूप में मॉडल करने की कोशिश की, जहाँ इन-बॉक्स बनाम आउट-ऑफ-बैंड अब मायने नहीं रखते। हालाँकि, यह गड़बड़ और अधिक जटिल था जितना हमने अनुमान लगाया था।

नतीजतन, हमने कोर / स्टैंडर्ड 2.0 के साथ नूगेट ग्राफ के रूप में .NET प्लेटफॉर्म को मॉडलिंग करने का विचार छोड़ दिया।

सामान्य उत्तर है:

.NET कोर 2.0 और .NET मानक 2.0 के साथ आपको बिल्कुल SystemNetHttpClient NuGet पैकेज को संदर्भित करने की आवश्यकता नहीं होनी चाहिए। हालांकि यह 1.x निर्भरता से खींचा जा सकता है।

वही .NET फ्रेमवर्क के लिए जाता है: यदि आप 4.5 और ऊपर लक्ष्य करते हैं, तो आपको आमतौर पर NuGet पैकेज के बजाय इन-बॉक्स संस्करण का उपयोग करना चाहिए। फिर, आप इसे .NET मानक 1.x और PCL निर्भरता के लिए खींच सकते हैं, लेकिन .NET Framework के विरुद्ध सीधे लिखे गए कोड का उपयोग नहीं करना चाहिए।

तो क्यों पैकेज अभी भी मौजूद है / हम अभी भी इसे अपडेट क्यों करते हैं? केवल इसलिए कि हम मौजूदा कोड का काम करना चाहते हैं जिसने उस पर निर्भरता ले ली है। हालाँकि, जैसा कि आपने पाया कि .NET फ्रेमवर्क पर आसानी से सेलिंग नहीं है।

विरासत पैकेज का इरादा मॉडल है: यदि आप .NET फ्रेमवर्क 4.5+, .NET कोर 2+, .NET मानक 2+ से पैकेज का उपभोग करते हैं, तो पैकेज केवल प्लेटफॉर्म को आगे की ओर लागू करता है, बशर्ते कि इसका अपना संस्करण लाने का विरोध हो।

हालांकि सभी मामलों में वास्तव में ऐसा नहीं होता है: HTTP ग्राहक पैकेज (आंशिक रूप से) .NET फ्रेमवर्क पर इन-बॉक्स घटकों को प्रतिस्थापित करता है जो कुछ ग्राहकों के लिए काम करते हैं और दूसरों के लिए विफल होते हैं। इस प्रकार, अब हम आसानी से समस्या को ठीक नहीं कर सकते।

उसके ऊपर हमारे पास .NET फ्रेमवर्क के साथ सामान्य बाइंडिंग समस्याएँ हैं, इसलिए यदि आप बाइंडिंग पुनर्निर्देशन जोड़ते हैं तो यह वास्तव में अच्छी तरह से काम करता है। वाह!

इसलिए, एक पुस्तकालय लेखक के रूप में मेरी सिफारिश है कि इस पैकेज पर निर्भरता लेने से बचें और .NET फ्रेमवर्क 4.5, .NET कोर 2.0 और .NET स्टैंडर्ड 2.0 में इन-बॉक्स संस्करणों को प्राथमिकता दें। "

https://twitter.com/terrajobst/status/997262020108926976


8

Microsoft.Net.Httpअतिरिक्त Microsoft.Bclनिर्भरता की आवश्यकता है।

उसके लिए, यदि आप केवल .NET फ्रेमवर्क या .NET कोर को लक्षित करते हैं, तो System.Net.Httpजाना अच्छा है। अन्यथा, Microsoft.Net.Httpबेहतर विकल्प होगा क्योंकि यह अगली पीढ़ी हो सकती है।


8
ऐसा लगता है कि MS ने इस पोस्ट के लिए अपना मन बदल लिया है ... stackoverflow.com/questions/39016373/… microsoft.net.http को 2015 से अपडेट नहीं किया गया है जबकि system.net.http सिर्फ कुछ महीने का साबूदाना (नगेट) है ।
smoore4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.