System.Net.Http กับ Microsoft.Net.Http


86

ฉันใช้ ASP.NET Core ฉันต้องการใช้HttpClientแต่ฉันสังเกตเห็นว่ามีแพ็คเกจ NuGet สองแพ็คเกจที่เสนอ ฉันจะใช้อันไหน?


ดูเหมือนว่าขึ้นอยู่กับSystem.Net.Http Microsoft.Net.Httpแต่ก็ขึ้นอยู่กับว่าคุณพยายามทำอะไรกับแอปพลิเคชันของคุณ
John Odom

คำตอบ:


65

ขึ้นอยู่กับรุ่น System.Net.Httpแพ็คเกจเก่า(รุ่น2.0 ) เป็นแพ็คเกจดั้งเดิมที่เลิกใช้แล้วMicrosoft.Http.Netตามคำอธิบาย:

แพ็คเกจเดิม System.Net.Http รวมอยู่ในแพ็คเกจ 'Microsoft.Net.Http' แล้ว

พวกเขามีอยู่เพื่อให้HttpClientในรุ่นก่อนหน้านี้และ .NET ห้องสมุดชั้นแบบพกพา คุณควรใช้Microsoft.Net.Httpในกรณีนั้น

เนื่องจากคุณใช้. NET Core คุณควรใช้System.Net.Httpแพ็คเกจล่าสุด(เช่น 4.3.3)

อัปเดตสำหรับ csproj

ในฐานะของ .NET มาตรฐาน 2.0 แพคเกจรวมอยู่และสามารถใช้ได้เมื่อคุณกำหนดเป้าหมายSystem.Net.HttpClient netstandard2.0หากด้วยเหตุผลบางประการคุณยังคงต้องการอ้างอิงทั้ง. NET และ. NET Core เต็มรูปแบบคุณสามารถเพิ่มสิ่งนี้ลงในไฟล์ 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

หาก project.json ของคุณกำหนดเป้าหมายทั้ง. NET และ. NET Core แบบเต็มคุณต้องเพิ่ม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 Core (4.1.0) ทำ ดังนั้นหากคุณใช้. NET เวอร์ชันเต็มคุณต้องกำหนดค่าตัวจัดการด้วยตนเองเพื่อใช้การบีบอัด gzip / deflate Description: github.com/dotnet/docs/issues/1054
Jeppe Andersen

28
คำตอบนี้สรุปความยุ่งเหยิงที่เกิดขึ้นกับ. NET Core, .NET Standard และ. NET Framework
Vincent

1
@vincent มันไม่ปวดตูดมากไปกว่าตอนที่คนใช้โมโน ฯลฯ หลายแพลตฟอร์มมักจะมีจุดที่เจ็บปวดอยู่เสมอ
ม้วน

4
ฉันไม่เห็น "แพ็กเกจเดิมSystem.Net.Httpรวมอยู่ในMicrosoft.Net.Httpแพ็กเกจแล้ว" ภาษาที่คุณอ้างถึงในคำอธิบายแพ็คเกจ ในความเป็นจริงSystem.Net.Httpแพคเกจดูเหมือนจะได้รับการอัปเดตล่าสุด (หลายปี)
Dan Esparza

2
@DanEsparza ถ้าคุณดูลิงค์ที่ฉันโพสต์คุณจะเห็นข้อความ ฉันยังพูดถึงว่ามีเพียงแพ็คเกจเก่า (รุ่น 2.0) เท่านั้นที่เลิกใช้งาน แพ็คเกจ 4.xx ล่าสุดเป็นแพ็คเกจใหม่ล่าสุดและคุณควรใช้
Henk Mollema

19

สำหรับใครก็ตามที่สนใจข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้Immo Landwerth (ตัวจัดการโปรแกรมบน. NET ที่ Microsoft) ได้ทวีตเกี่ยวกับสิ่งนี้:

"HttpClient เริ่มต้นจากการเป็นแพ็คเกจ NuGet (นอกแบนด์) และถูกเพิ่มไปยัง. NET Framework ใน 4.5 ด้วย (ในกล่อง)

ด้วย. NET Core / .NET Standard เดิมทีเราพยายามสร้างแบบจำลองแพลตฟอร์ม. NET เป็นชุดของแพ็กเกจที่การอยู่ในกล่องเทียบกับนอกแบนด์ไม่สำคัญอีกต่อไป อย่างไรก็ตามสิ่งนี้ยุ่งเหยิงและซับซ้อนกว่าที่เราคาดการณ์ไว้

ด้วยเหตุนี้เราจึงละทิ้งแนวคิดส่วนใหญ่ในการสร้างแบบจำลองแพลตฟอร์ม. NET เป็นกราฟ NuGet ด้วย Core / Standard 2.0

คำตอบทั่วไปคือ:

ด้วย. NET Core 2.0 และ. NET Standard 2.0 คุณไม่จำเป็นต้องอ้างอิงแพ็คเกจ SystemNetHttpClient NuGet เลย มันอาจถูกดึงมาจากการอ้างอิง 1.x แม้ว่า

NET Framework เช่นเดียวกัน: หากคุณกำหนดเป้าหมาย 4.5 ขึ้นไปโดยทั่วไปคุณควรใช้เวอร์ชันในกล่องแทนแพ็คเกจ NuGet อีกครั้งคุณอาจดึงมันเข้ามาสำหรับ. NET Standard 1.x และการอ้างอิง PCL แต่ไม่ควรใช้โค้ดที่เขียนโดยตรงกับ. NET Framework

เหตุใดแพ็คเกจจึงยังคงอยู่ / ทำไมเรายังอัปเดตอยู่? เพียงเพราะเราต้องการให้โค้ดที่มีอยู่ทำงานโดยอาศัยการอ้างอิง อย่างไรก็ตามในขณะที่คุณค้นพบว่าการแล่นบน. NET Framework ไม่ราบรื่น

รูปแบบที่ต้องการสำหรับแพ็กเกจเดิมคือ: หากคุณใช้แพ็กเกจจาก. NET Framework 4.5+, .NET Core 2+, .NET Standard 2+ แพ็กเกจจะส่งต่อไปยังแพลตฟอร์มที่ให้การใช้งานเท่านั้นซึ่งต่างจากการนำเวอร์ชันของตัวเองมาใช้

นั่นไม่ใช่สิ่งที่เกิดขึ้นจริงในทุกกรณี: แพคเกจไคลเอ็นต์ HTTP จะ (บางส่วน) แทนที่ส่วนประกอบในกล่องบน. NET Framework ซึ่งเกิดขึ้นกับลูกค้าบางรายและล้มเหลวสำหรับผู้อื่น ดังนั้นเราจึงไม่สามารถแก้ไขปัญหาได้อย่างง่ายดายในตอนนี้

ยิ่งไปกว่านั้นเรามีปัญหาการผูกกับ. NET Framework ตามปกติดังนั้นสิ่งนี้จึงใช้ได้ดีก็ต่อเมื่อคุณเพิ่มการเปลี่ยนเส้นทางการผูก เย้!

ดังนั้นในฐานะผู้เขียนไลบรารีคำแนะนำของฉันคือหลีกเลี่ยงการพึ่งพาแพ็คเกจนี้และชอบเวอร์ชันในกล่องใน. NET Framework 4.5, .NET Core 2.0 และ. NET Standard 2.0 "

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


8

Microsoft.Net.Httpต้องการการMicrosoft.Bclอ้างอิงเพิ่มเติม

สำหรับสิ่งนั้นหากคุณกำหนดเป้าหมายเฉพาะ. NET Framework หรือ. NET Core System.Net.Httpก็เป็นสิ่งที่ดี มิฉะนั้นMicrosoft.Net.Httpจะเป็นทางเลือกที่ดีกว่าเพราะอาจเป็นรุ่นต่อไป


8
ดูเหมือนว่า MS มีการเปลี่ยนแปลงจิตใจของพวกเขาเช่นนี้ alludes โพสต์ไป ... stackoverflow.com/questions/39016373/... microsoft.net.http ยังไม่ได้รับการปรับปรุงตั้งแต่ 2015 ในขณะที่ system.net.http เป็นเพียงไม่กี่เดือนสาคู (nuget) .
smoore4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.