ไม่พบปัญหาแปลก ๆ กับ System.Net.Http 4.2.0.0


110

ฉันมีปัญหาแปลก ๆ ที่ทำให้ฉันแทบคลั่ง ...

ฉันมีโครงการ Class Library อย่างง่าย (Full .NET Framework, 4.6.1) พร้อมคลาส wrapper สำหรับการทำงานรอบ ๆ Cosmos DB ดังนั้นฉันจึงได้เพิ่ม“ Microsoft.Azure.DocumentDB” NuGet Package 1.19.1 ลงในโครงการนี้ นอกเหนือจากนั้นฉันมีข้อมูลอ้างอิงถึงแพ็คเกจ NuGet“ Newtonsoft.Json” 10.0.3 รวมถึง“ Microsoft.Diagnostics.EventFlow. *” อีกสองสามรายการ

จนถึงขณะนี้ทุกอย่างรวบรวมโดยไม่มีข้อผิดพลาดใด ๆ

แต่ทันทีที่ฉันเข้าสู่คลาส Wrapper ของฉัน - ใช้จาก Service Fabric Stateless Service อย่างง่าย (Full .NET Framework 4.6.1) - และพยายามเรียกใช้โค้ดบรรทัดต่อไปนี้:

_docClient = new DocumentClient(new Uri(cosmosDbEndpointUrl), cosmosDbAuthKey);

ฉันได้รับข้อผิดพลาดแปลก ๆ ที่รันไทม์:

System.IO.FileNotFoundException เกิดขึ้น HResult = 0x80070002
ข้อความ = ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Net.Http, เวอร์ชัน = 4.2.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = b03f5f7f11d50a3a' หรือการอ้างอิงอย่างใดอย่างหนึ่ง ระบบไม่พบแฟ้มที่ระบุ.
Source = StackTrace: ที่ Microsoft.Azure.Documents.Client.DocumentClientInitialize (Uri 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, NullableserviceEndpoint , ConnectionPolicy connectionPolicy, Nullable 1 neededConsistencyLevel)

ข้อยกเว้นภายใน 1: FileNotFoundException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Net.Http, เวอร์ชัน = 4.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = b03f5f7f11d50a3a' หรือการอ้างอิงอย่างใดอย่างหนึ่ง ระบบไม่พบแฟ้มที่ระบุ.

ฉันไม่รู้เลยว่าทำไมไม่พบแอสเซมบลี System.Net.Http เลย - แม้กระทั่งการอ้างอิงแอสเซมบลีในโปรเจ็กต์ไลบรารีคลาสของฉันไปยัง. Net Framework Assembly“ System.Net.Http 4.0.0.0”

สิ่งที่ฉันไม่เข้าใจก็คือมีการเปลี่ยนเส้นทางการผูกแปลก ๆ นี้ไปที่ 4.2.0.0 - อันนี้มาจากไหน? เพื่อหลีกเลี่ยงสิ่งนี้ฉันพยายามเพิ่มการเปลี่ยนเส้นทางต่อไปนี้ไปยัง app.config ของ Service Fabric Service (ซึ่งใช้ไลบรารีคลาส):

แต่ก็ยังไม่แตกต่างฉันยังคงได้รับข้อผิดพลาดขณะรันไทม์

ใครมีเบาะแส? ใครเคยเห็นปัญหาดังกล่าว?

ขอขอบคุณและขอแสดงความนับถือ OliverB


3
สวัสดี OliverB! คุณพบวิธีแก้ปัญหาสำหรับปัญหานี้หรือไม่ ฉันเพิ่งเผชิญสถานการณ์เดียวกันและมันก็เป็นฝันร้าย :-(
user1178399

@HansPassant ที่ลิงค์เสียตอนนี้
reggaeguitar

ฉันตอบสิ่งนี้: stackoverflow.com/a/63031440/330680
Mahdi

หากคำตอบ 5 อันดับแรกไม่เหมาะกับคุณโปรดดูคำตอบของฉันด้านล่างเกี่ยวกับการเพิ่มแอสเซมบลีในส่วนการรวบรวมของ web.config
CrnaStena

คำตอบ:


129

ปัญหาที่คุณกำลังเผชิญเกี่ยวข้องกับ Visual Studio โดยเฉพาะอย่างยิ่ง 2017 System.Net.Http v4.2.0.0ซึ่งเป็นที่มาพร้อมกับ อย่างไรก็ตามการนำวิธีการใหม่มาใช้โดยการอ้างอิงใด ๆ ควรดำเนินการผ่าน NuGet ซึ่งเวอร์ชันล่าสุดSystem.Net.Httpคือ 4.3.3 มี dll เวอร์ชัน 4.1.1.2

ปัญหาคือ VS ในเวลาสร้างและเวลาทำงานเช่นกันจะเพิกเฉยต่อการอ้างอิงของคุณและจะพยายามอ้างอิง DLL ที่มันรู้

วิธีแก้ไข:

  • ตรวจสอบให้แน่ใจว่ามีการอ้างอิงถึง System.Net.Http ผ่าน NuGet
  • สร้างข้อผิดพลาดเวลา:เปลี่ยนส่วนขยายของ System.Net.Http.dll (หรือย้ายไปที่อื่น ... โดยทั่วไปกำจัดมัน) ที่มาพร้อมกับ VS 2017 ( c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\); หากคุณมีเวอร์ชันอื่นเส้นทางจะแตกต่างกันเล็กน้อยแม้ว่าจะไม่มากนัก
  • ข้อผิดพลาดรันไทม์:เพิ่มการเปลี่ยนเส้นทางการรวมแอสเซมบลี

หากคุณดูออนไลน์บน Google คุณจะพบปัญหาบางอย่างเกี่ยวกับ Microsoft เกี่ยวกับเรื่องนี้ดังนั้นหวังว่าพวกเขาจะแก้ไขได้ในอนาคต

หวังว่านี่จะช่วยได้

อัปเดต:

เมื่อดูการค้นหาการแก้ไขถาวรบางอย่างสำหรับปัญหานี้เพื่อทำงานกับ build agent สังเกตว่าหากคุณย้ายไปยังโมเดล NuGet PackageReference ใหม่ ( .csprojไม่อยู่ในpackages.config) มีแนวโน้มที่จะทำงานได้ดีขึ้น นี่คือลิงค์ไปยังคำแนะนำเกี่ยวกับวิธีอัปเกรดนี้: https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference


ดูเหมือนว่าพวกเขากำลังกระแทก vesion ใน net472 github.com/Microsoft/dotnet-framework-early-access/blob/master/…
Paul Miller

6
ขอบคุณมากที่พยายามแก้ปัญหานี้ในช่วงสองสามชั่วโมงที่ผ่านมา!
Flinkman

22
โปรดทราบว่าปัญหาอาจได้รับการแก้ไขโดยการลบ bindingRedirect หากคุณกำลังทำงานกับ. NET 4.7.2
Alternatex

1
ปัญหาเดียวกันในวันนี้เมื่ออัปเกรดเป็น 4.7.2 System.IO.Compression และ System.Runtime ก็ได้รับผลกระทบเช่นกัน การลบการเปลี่ยนเส้นทางที่เชื่อมโยงช่วยแก้ปัญหาได้
. กับโมนิก้า.

7
ใช่ ในที่สุด! ตาม @Alternatex และ JB ด้านบนสำหรับ 4.7.2 ลบ bindingRedirects และตอนนี้เป็นสีทอง สิ่งที่น่าปวดหัวสำหรับการอัปเดตทุกเฟรมเวิร์กเพื่อค้นหาเพลงและท่าเต้นล่าสุดที่จำเป็นสำหรับ System.Net.Http
Ted

77

การลบการเปลี่ยนเส้นทางที่ผูกไว้ใช้ได้ผลสำหรับฉันคุณสามารถลองลบได้:

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />

2
นั่นเป็นหนึ่งในสิ่งแรกที่ฉันพยายาม แต่ไม่ประสบความสำเร็จ
OliverB

2
การลบ bindingRedirect ช่วยแก้ปัญหาให้ฉันได้ การทดสอบหน่วยไม่ผ่านโดยมีข้อผิดพลาดเดียวกันกับ OP และตอนนี้ก็ใช้งานได้แล้ว
Edu

1
นี่คือ codeline แบบเต็มหรือไม่ แล้วสิ่งนี้ต้องเพิ่มตรงไหน? BindingRedirects อื่น ๆ ของฉันทั้งหมดอยู่ในแท็กdependentAssembly
Flo

1
สิ่งนี้ได้ผลดี ฉันจะเพิ่มถ้าคุณมีหลายโครงการในโซลูชันของคุณตรวจสอบให้แน่ใจว่าคุณประเมินโครงการทั้งหมดและแก้ไขโดยใช้วิธีนี้
สกู๊ตเตอร์

1
ขอบคุณ. ติดปัญหาตั้งแต่ 2 วันนี้ ได้ผล !!!
Sagar Khatri

18

เพิ่มเติมจากคำตอบที่ @AndreiU ให้แล้วและวิธีการสร้างข้อผิดพลาดรันไทม์ภายในเครื่อง

ฉันได้รับข้อผิดพลาดรันไทม์ด้านล่างเมื่อปรับใช้กับ Azure ไม่ใช่ในเครื่อง

ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' หรือการอ้างอิงอย่างใดอย่างหนึ่ง ระบบไม่พบไฟล์ที่ระบุ "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" ที่ Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n ที่ Company.Project .BackOffice.Web.Controllers.OrderController..ctor () ใน C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: บรรทัด 30 \ r \ n ที่ lambda_method ( Closure) \ r \ n ที่ System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (คำขอ HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} วัฒนธรรม = เป็นกลาง PublicKeyToken = b03f5f7f11d50a3a 'หรือการอ้างอิงอย่างใดอย่างหนึ่ง ระบบไม่พบไฟล์ที่ระบุ "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" ที่ Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n ที่ Company.Project .BackOffice.Web.Controllers.OrderController..ctor () ใน C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: บรรทัด 30 \ r \ n ที่ lambda_method ( Closure) \ r \ n ที่ System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (คำขอ HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} วัฒนธรรม = เป็นกลาง PublicKeyToken = b03f5f7f11d50a3a 'หรือการอ้างอิงอย่างใดอย่างหนึ่ง ระบบไม่พบไฟล์ที่ระบุ "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" ที่ Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n ที่ Company.Project .BackOffice.Web.Controllers.OrderController..ctor () ใน C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: บรรทัด 30 \ r \ n ที่ lambda_method ( Closure) \ r \ n ที่ System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (คำขอ HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}}

System.Net.Httpเมื่อผมเริ่มมองหาที่ประกอบฉันจะได้เห็นว่าโครงการเว็บและการบริการของฉันที่กำหนดเป้าหมายโครงการรุ่นที่แตกต่างกันสำหรับ

โครงการเว็บ:

ป้อนคำอธิบายภาพที่นี่

โครงการบริการ:

ป้อนคำอธิบายภาพที่นี่

มันเป็นเรื่องง่ายที่จะคิดว่านี้เกิดจากที่ไม่ตรงกันในรุ่น The system cannot find the file specified.แต่ที่สำคัญที่นี่คือการมองไปที่ข้อผิดพลาด

เมื่อมองไปที่คุณสมบัติเส้นทางเราจะเห็นว่าโครงการเว็บกำหนดเป้าหมายแอสเซมบลี. Net Framework ในขณะที่บริการกำหนดเป้าหมายแอสเซมบลีจาก Visual Studio 2017 เนื่องจากเซิร์ฟเวอร์ไม่ได้ติดตั้ง Visual Studio 2017 ข้อผิดพลาดรันไทม์จะเกิดขึ้น

เส้นทางเว็บ:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll

เส้นทางบริการ:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll

สิ่งที่ง่ายพอ ๆ กับการตั้งค่าCopy Localเพื่อtrueแก้ไขปัญหา แต่ไม่ใช่ในทุกกรณี

ป้อนคำอธิบายภาพที่นี่

ในการทำให้เกิดข้อผิดพลาดในเครื่องของคุณอีกครั้งให้ลบสิ่งที่จำเป็นSystem.Net.Http.dllออกจากโฟลเดอร์เฉพาะของ Visual Studio ซึ่งจะทำให้คุณเกิดข้อผิดพลาดรันไทม์และอาจมีข้อผิดพลาดในการสร้าง หลังจากได้รับการแก้ไขแล้วทุกอย่างควรใช้งานได้อย่างน้อยก็ทำเพื่อฉัน

หากคุณติดตั้งSystem.Net.Httpผ่านการNuGetตรวจสอบว่าใช้ชุดประกอบใดโดยดูที่.csprojเวอร์ชัน System.Net.Http 4.3.4ยกตัวอย่างการประกอบดังต่อไปนี้:

<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
  <Private>True</Private>
  <Private>True</Private>
</Reference>

หากคุณใช้บิลด์เซิร์ฟเวอร์เช่น Jenkins, TeamCity หรือ AppVeyor รันไทม์ที่ขาดหายไป.dllอาจมีอยู่เช่นกัน ในกรณีนี้อาจไม่ช่วยในการใช้ System.Net.Http เวอร์ชัน NuGet หรือการลบสิ่งที่หายไป.dllในเครื่อง PublicKeyTokenเพื่อแก้ปัญหาข้อผิดพลาดนี้ดูที่รุ่นที่ไม่ได้พบและเฉพาะเจาะจง หลังจากนั้นให้สร้างการเปลี่ยนเส้นทางการผูกในอย่างใดอย่างหนึ่งWeb.configหรือApp.configขึ้นอยู่กับโครงการของคุณ ในกรณีของฉันฉันต้องการใช้ 4.0.0.0 แทน:

<dependentAssembly>
  <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

เธรด Github ที่ดีเกี่ยวกับปัญหา:

https://github.com/dotnet/corefx/issues/22781


4
การเพิ่ม <dependentAssembly> <assemblyIdentity name = "System.Net.Http" ....... ทำงานแบบฉัน ขอบคุณ
โรมิโอ

สำหรับฉันเช่นกัน! ขอบคุณสำหรับวิธีแก้ปัญหา! oldVersion = "0.0.0.0-4.2.0.0" newVersion = "4.1.1.3" เนื่องจากฉันใช้
4.1.1.3

การเปลี่ยนเส้นทางไปที่ 4.0.0.0 คือสิ่งที่ทำให้ฉันอยู่ในอันดับต้น ๆ ขอบคุณ!
Jim G.

การเปลี่ยนเส้นทางลงเป็นอันตราย! คุณมีการพึ่งพาในโครงการของคุณการส่งสัญญาณว่าใช้ 4.2 แต่คุณบังคับให้ใช้ 4.0 หากใช้คุณสมบัติหรือวิธีการใหม่ ๆ ที่แนะนำโพสต์ 4.0 คุณจะได้รับความล้มเหลวของรันไทม์ในเวลาที่คาดเดาได้ยาก
David Burg

ลิงก์ไปยังเธรด github นั้นตายแล้ว แต่ดูเหมือนว่าหัวข้อต่อไปนี้จะมีการสนทนาที่เกี่ยวข้อง: github.com/dotnet/runtime/issues/24382
Hermann.Gruber

7

ฉันเพิ่งติดตั้งSystem.Net.Httpโดยใช้ NuGet คุณสามารถคว้าได้ที่นี่:

https://www.nuget.org/packages/System.Net.Http/

โครงการผมทำงานเกี่ยวกับเป้าหมายASP.NET MVC .NET 4.6.1ทำงานได้อย่างสมบูรณ์บนเครื่องของฉันในขณะที่แก้ไขข้อบกพร่องIIS Expressด้วย Visual Studio 2019

ปัญหาเกิดขึ้นเมื่อพยายามเรียกใช้แอปพลิเคชันที่ปรับใช้กับ Azure ฉันได้รับข้อผิดพลาดนี้:

ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' หรือการอ้างอิงอย่างใดอย่างหนึ่ง

สิ่งที่ใช้ได้ผลจริงในกรณีของฉันคือการเปิดไฟล์. csproj และค้นหาสิ่งที่System.Net.Httpชอบในภาพหน้าจอต่อไปนี้ ...

ป้อนคำอธิบายภาพที่นี่

ดูว่า.csprojไฟล์มีเวอร์ชัน4.1.1.3:

<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">

ที่<HintPath>จริงชี้ไปที่..\packagesโฟลเดอร์จาก Nuget นั่นคือนี่คือเวอร์ชันจริงที่ติดตั้งโดย Nuget เมื่อปรับใช้เวอร์ชันเฉพาะนี้จะถูกเรียกคืนที่ฝั่งเซิร์ฟเวอร์และทุกอย่างควรทำงานร่วมกับการเปลี่ยนเส้นทางการผูก

... ดังนั้นการเปลี่ยนเส้นทางที่มีผลผูกพันควรกล่าวถึงเวอร์ชันเฉพาะนี้ในWeb.configลักษณะนี้:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.1.1.3" />
</dependentAssembly>

นี้ได้รับการแก้ไขปัญหาที่เกิดขึ้นในกรณีของฉันหลังจากที่สองของกระทำกับAzure Kudu ในที่สุดเว็บไซต์ Azure ก็เริ่มต้นโดยไม่มีข้อผิดพลาด


5

สิ่งที่ฉันทำเพื่อแก้ไขปัญหาคือลบการผูกทั้งหมดออกจาก web.config และทำไฟล์

Update-Package -reinstall

สิ่งนี้ได้ลบการผูกแบบเก่าที่อาจไม่จำเป็นต้องมีและทำความสะอาดได้ดีจริงๆ


2

ฉันพบข้อผิดพลาดนี้เมื่อฉันปรับใช้บริการเว็บกับเซิร์ฟเวอร์ของเรา โครงการกำหนดเป้าหมาย. Net framework 4.7.2 ซึ่งไม่ได้ติดตั้งบนเซิร์ฟเวอร์ การติดตั้งกรอบ 4.7.2 บนเซิร์ฟเวอร์ช่วยแก้ไขปัญหา


นี่เป็นปัญหาของฉันด้วย เป็นหัวข้อที่เกิดซ้ำสำหรับเวอร์ชันอื่น ๆ เช่นกัน
Jason Geiger

2

คำตอบของ Andrei U นำไปสู่ความรอดของฉัน อย่างไรก็ตามการให้เหตุผลไม่ตรงกับกรณีของฉัน สำหรับคนที่ตกอยู่ในสถานการณ์เดียวกันกับฉัน:

มันเป็นข้อผิดพลาดของรันไทม์ (ไม่ใช่เวลาสร้าง) ซึ่งการสร้างสำเร็จ แต่จะทำงานบนคอมพิวเตอร์เครื่องเดียว แต่ไม่ใช่เซิร์ฟเวอร์ วิธีแก้ไข: - เพิ่มแพ็คเกจ System.Net.Http - เปลี่ยนชื่อไฟล์: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.7.2 \ System.Net.Http.dll (เช่นเปลี่ยนชื่อเป็น: System.Net.Http.dll.BAK) บน สร้างเซิร์ฟเวอร์

ฉันไม่มีและยังไม่มีการเปลี่ยนเส้นทางแอสเซมบลีสำหรับ dll นี้


1

วิธีแก้ปัญหาง่ายๆวิธีหนึ่งที่ฉันพบว่าปรับลดระดับกรอบเป้าหมายสำหรับโครงการเว็บเป็น 4.6

ฉันสร้างไคลเอนต์และเว็บแอปพลิเคชันไคลเอนต์ที่มี. net framework 4.7.1 และเว็บที่มีเหมือนกันและฉันกำลังประสบปัญหาเดียวกันเมื่อฉันดาวน์เกรด. net framework เป้าหมายสำหรับเว็บมันใช้ได้สำหรับฉัน


1

หลังจากต่อสู้กับสิ่งนี้มาสองสามวันในที่สุดฉันก็ได้ปัญหา. Net 4.7.2 / System.Net.Http สำหรับโครงการของฉัน นอกจากการเปลี่ยนไฟล์ * .csproj เพื่อกำหนดเป้าหมายเฟรมเวิร์กเวอร์ชัน 4.7.2 แล้วฉันยังต้องอัปเดต app.config ในโครงการจาก

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />

ถึง:

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />

0

ผมมีปัญหาเหมือนกัน. ในที่สุดฉันก็แก้ไขได้โดยเปลี่ยน Deploy-FabricApplication.ps1 เป็นแบบนี้

$binFolder = "$LocalFolder\..\..\..\..\Bin"

$httpDllLocation = "$binFolder\System.Net.Http.dll"
$codeFolder = "$ApplicationPackagePath\[ProjectName].ServicesPkg\Code"
$configFile = "$codeFolder\[ProjectName].Services.exe.config"

Copy-Item $httpDllLocation -Destination $codeFolder 

$appConfig = [xml](cat $configFile)
$appConfig.configuration.runtime.assemblyBinding.dependentAssembly | foreach {

    $name = $_.assemblyIdentity.name
    #Write $name
    if($name -eq 'System.Net.Http')
    {
        Write 'System.Net.Http changed'

        $_.bindingRedirect.newVersion = '4.2.0.0'
    }
}
$appConfig.Save($configFile)

ฉันพบ 4.2.0.0 System.Net.Http.dll นั่นคือ x64 ก่อนที่จะปรับใช้สคริปต์นี้คัดลอก dll ไปยังไดเร็กทอรีแพ็กเกจและเปลี่ยนไฟล์กำหนดค่าเพื่อใช้ไฟล์นี้อย่างชัดเจน ฉันยังเขียนบล็อกเกี่ยวกับปัญหา System.Net.Http ของฉันที่http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-pro issues.html

อย่าลืมแทนที่ [ProjectName] ด้วยชื่อโปรเจ็กต์ของคุณเอง

หวังว่านี่จะช่วยได้โปรดอย่าลังเลที่จะถาม


0

สำหรับฉันเป็นอะไรที่แปลกจริงๆ ต้องใช้เวลาหลายชั่วโมงในการแก้ไขข้อบกพร่องหลังจากพบว่าปัญหาคืออะไร มันไม่ได้เกิดขึ้นในพื้นที่ แต่เฉพาะเมื่อใช้เจนกินส์ในการสร้างโครงการ

ฉันมีห้องสมุดขนาดเล็กที่ใช้ dotnet standart 2.0 และโครงการหลักคือโครงการ WCF ซึ่งใช้. NET ปกติ (ของฉันคือ v4.6.1 โดยเฉพาะ) แต่ในคลาสเริ่มต้นของไลบรารีมาตรฐานดอทเน็ตฉันมีรหัสบางอย่างที่มีลักษณะดังนี้:

public static class CoreModule
{
    public static IServiceCollection AddStaticDataConfiguration(
        this IServiceCollection services, Func<IServiceProvider, IStaticDataConfiguration>  staticDataConfiguration) 
    {  
        services.TryAddSingleton(staticDataConfiguration);
        services.TryAddSingleton<Func<HttpClient>>(x =>
        {
            var configuration = staticDataConfiguration(x);

            return configuration.ClientResolver ?? (() => new HttpClient());
        });
        return services;
    }
}

อินเทอร์เฟซ IStaticDataConfiguration มีลักษณะดังนี้:

public interface IStaticDataConfiguration
{
    //..... some stuff

    Func<HttpClient> ClientResolver { get; set; }
}  

อินเทอร์เฟซนี้อยู่ภายในไลบรารีมาตรฐาน dotnet ในขณะที่การนำไปใช้งานอยู่ภายนอก (อยู่ในโครงการ WCF)

จากภายนอกห้องสมุดฉันเรียกAddStaticDataConfigurationวิธีการดังต่อไปนี้:

serviceCollection.AddStaticDataConfiguration(p =>
{
    var staticDataConfig = p.GetService<IStaticDataConfiguration>();
    return new StaticDataProviderConfiguration
    {
        //...some other stuff
        ClientResolver = () => restRequestFactory.GetInstrumentedClient("StaticDataService") //this returns an HttpClient
    };
});

ปัญหาคือฉันกำลังส่งFunc<HttpClient>จากโปรเจ็กต์. NET ปกติไปยังไลบรารีมาตรฐานดอทเน็ตซึ่งด้วยเหตุผลที่บ้าคลั่ง dotnet standart ไม่ชอบและอาจคิดว่าHttpClientมาจากคลาสที่แตกต่างกันดังนั้นจึงSystem.Net.Http 4.x.x.xไม่พบข้อยกเว้น เมื่อลบโค้ดออกเพื่อไม่ยอมรับ a HttpClientจากโปรเจ็กต์. NET ปกติ แต่สร้างใหม่funcภายในไลบรารีตัวเองก็มีความสุขและทำงานได้ดี หวังว่านี่อาจช่วยคนอื่นได้เนื่องจากข้อผิดพลาดนี้เกิดขึ้นจากหลายสาเหตุ :)


0

วิธีแก้ปัญหาของฉันคล้ายกับ @ Raquib's โปรเจ็กต์ของฉันคือ 4.7.2 และทำงานได้ดีบนพีซีของฉัน เมื่อใดก็ตามที่ฉันปรับใช้กับเซิร์ฟเวอร์ dev ของเราฉันจะได้รับปัญหาที่กล่าวถึงในคำถาม ปรากฎว่าเวอร์ชัน. net สูงสุดบนเซิร์ฟเวอร์คือ 4.6.1 การดาวน์เกรดโครงการของฉันเป็น 4.6.1 แก้ไขปัญหาได้ การอัปเกรดเวอร์ชัน. net ของเซิร์ฟเวอร์ไม่ใช่ตัวเลือกสำหรับฉัน


0

ผมเชื่อว่าเป็นส่วนหนึ่งของคำตอบที่สามารถพบได้ในไมโครซอฟท์เอกสาร

เมื่อคุณสร้างแอปบนเดสก์ท็อปใน Visual Studio ที่กำหนดเป้าหมายเป็น. NET Framework 4.5.1 หรือเวอร์ชันที่ใหม่กว่าแอปจะใช้การเปลี่ยนเส้นทางการเชื่อมโยงอัตโนมัติ

ดังที่คำตอบของ @Vivek Sharma ชี้ให้เห็นการลบ:

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />

แก้ไขปัญหาใน 3 กรณีดังกล่าวในแอปของฉัน เมื่อคุณตรวจสอบ DLL ด้วย Powershell ตัวอย่างเช่น:

 ([system.reflection.assembly]::loadfile("C:\MyApp\bin\System.Net.Sockets.dll")).FullName

เอาท์พุต

System.Net.Sockets เวอร์ชัน = 4.0.0.0

เห็นได้ชัดว่าการเปลี่ยนเส้นทางการเชื่อมโยงไปยัง4.2.0.0จะไม่ทำงานเนื่องจากเราส่งออก4.0.0.0ไปยังถังขยะ

นอกจากนี้ยังควรตรวจสอบ GAC เพื่อดูว่าชุดประกอบหายไปจากที่นั่นหรือไม่:

 gacutil -l System.Net.Sockets

ในกรณีของฉันเวอร์ชันเฉพาะก็หายไปจาก GAC ด้วย หาก DLL ที่อยู่ใน GAC แล้วก็ควรได้รับการค้นพบในกระบวนการที่มีผลผูกพันการชุมนุม


0

นอกจากคำแนะนำมากมายข้างต้นนี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

  1. ลบแพ็คเกจ Nuget 4.3.4 (ฉันต้องดาวน์เกรดแพ็คเกจอื่นที่ต้องใช้)

  2. เพิ่มSystem.Net.Httpเป็นข้อมูลอ้างอิง (เวอร์ชัน 4.2.0.0)

  3. ลบ bindingRedirect

  4. เพิ่มSystem.Net.Httpในส่วนการรวบรวมในWeb.config(s)

    <system.web>
      <compilation debug="false" targetFramework="4.8">
        <assemblies>
          <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </assemblies>
      </compilation>
      <httpRuntime targetFramework="4.8"/>
    </system.web>

หากคุณมีพื้นที่ให้เพิ่มลงใน Web.config ด้วย อย่างน้อยฉันก็ต้องอยู่ในรหัสของฉัน


-2

ก่อนอื่นให้ลบออกจากระบบไฟล์ในเครื่องของคุณ:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\Syste.Net.Http.dll

จากนั้นลบการอ้างอิงทั้งหมดในโครงการและเพิ่มการอ้างอิง 4.0
สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้


3
โอ้ไม่โปรดอย่าทำให้การติดตั้ง VS ของคุณเสียหายโดยการลบไฟล์บางไฟล์
David Burg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.