ฉันใช้ ASP.NET Core ฉันต้องการใช้HttpClient
แต่ฉันสังเกตเห็นว่ามีแพ็คเกจ NuGet สองแพ็คเกจที่เสนอ ฉันจะใช้อันไหน?
ฉันใช้ ASP.NET Core ฉันต้องการใช้HttpClient
แต่ฉันสังเกตเห็นว่ามีแพ็คเกจ NuGet สองแพ็คเกจที่เสนอ ฉันจะใช้อันไหน?
คำตอบ:
ขึ้นอยู่กับรุ่น 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
}
}
}
System.Net.Http
รวมอยู่ในMicrosoft.Net.Http
แพ็กเกจแล้ว" ภาษาที่คุณอ้างถึงในคำอธิบายแพ็คเกจ ในความเป็นจริงSystem.Net.Http
แพคเกจดูเหมือนจะได้รับการอัปเดตล่าสุด (หลายปี)
สำหรับใครก็ตามที่สนใจข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้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 "
Microsoft.Net.Http
ต้องการการMicrosoft.Bcl
อ้างอิงเพิ่มเติม
สำหรับสิ่งนั้นหากคุณกำหนดเป้าหมายเฉพาะ. NET Framework หรือ. NET Core System.Net.Http
ก็เป็นสิ่งที่ดี มิฉะนั้นMicrosoft.Net.Http
จะเป็นทางเลือกที่ดีกว่าเพราะอาจเป็นรุ่นต่อไป
System.Net.Http
Microsoft.Net.Http
แต่ก็ขึ้นอยู่กับว่าคุณพยายามทำอะไรกับแอปพลิเคชันของคุณ