ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Net.Http, Version = 2.0.0.0 ใน MVC4 Web API


92

ฉันมีปัญหาแปลก ๆ เล็กน้อย
ฉันพัฒนาแอปด้วย MVC 4 และ Web API ใหม่และทำงานได้ดีในเครื่อง ฉันติดตั้ง MVC4 บนเซิร์ฟเวอร์และปรับใช้แอป ตอนนี้ฉันได้รับข้อผิดพลาดต่อไปนี้:

ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Net.Http, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' หรือหนึ่งในการอ้างอิง นิยามรายการของแอสเซมบลีที่อยู่ไม่ตรงกับการอ้างอิงแอสเซมบลี (ข้อยกเว้นจาก HRESULT: 0x80131040)

คำอธิบาย: มีข้อยกเว้นที่ไม่สามารถจัดการได้เกิดขึ้นระหว่างการดำเนินการตามคำขอของเว็บปัจจุบัน โปรดตรวจสอบการติดตามสแต็กสำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและที่มาที่ไป

ตลกพอรุ่นของ System.Net.Http ที่ฉันมีอยู่ในโฟลเดอร์แพ็คเกจของฉันหรือในโฟลเดอร์ ASP.NET MVC 4 \ Assemblies คือ 1.0.0.0 ฉันลบการอ้างอิงถึง System.Net.Http ออกจากโปรเจ็กต์ของฉันจริง ๆ แต่ฉันยังคงได้รับข้อความเดิม ฉันสับสนเล็กน้อยว่าได้รับข้อมูลอ้างอิง 2.0.0.0 จากที่ไหนและทำไมจึงใช้งานได้ในเครื่อง แต่ไม่ใช่บนเซิร์ฟเวอร์

ดูที่การอ้างอิงของ nuget:

ASP.NET WEb API Core Libraries (Beta) ขึ้นอยู่กับ System.Net.Http.Formatting
และ System.Net.Http.Formatting ขึ้นอยู่กับ System.Net.Http
ฉันเดาว่ามันมาจากไหน แต่ฉันมีเวอร์ชัน 2.0.20126.16343 ของแพ็คเกจนี้ติดตั้งอยู่เพียงแค่ว่า dll ภายในมีเวอร์ชัน 1.0.0.0

ฉันพลาดอะไรไปรึเปล่า?

อัพเดท:

นี่เป็นแอปพลิเคชันย่อยของแอป ASP.NET อื่น แต่อีกแอปหนึ่งยังคงใช้ WebForms มีบางอย่างกำลังยุ่งเหยิง แต่ถ้าฉันทำความสะอาดภายใต้ส่วนการประกอบใน web.config หากไม่พบแอปเองอีกต่อไป


คุณใช้คุณลักษณะ "เพิ่มการอ้างอิงที่ปรับใช้ได้" สำหรับโครงการนี้หรือไม่
ChristiaanV

ไม่ไม่ได้ลองทำ แต่ฉันได้ตั้งค่าทุกอย่างใหม่และตอนนี้มันใช้งานได้ .... ไม่น่าพอใจจริงๆ แต่ ...
Remy

ฉันมีปัญหานี้ทุกครั้งที่รีสตาร์ทเครื่องและเปิด Visual Studio ขึ้นมาใหม่เช่นกัน อย่างใดมันก็หายไปถ้าฉันทำความสะอาดแล้วสร้างโซลูชันใหม่
น้ำค้างแข็ง

คำตอบ:


30

ฉันมีปัญหาเดียวกันกับการปรับใช้แอพของฉันกับ appharbor ปัญหายังไม่รองรับ. NET 4.5 ฉันทำอะไรไป.

  1. เปลี่ยนโปรเจ็กต์ของฉันเป็นโปรไฟล์. NET 4.0
  2. ถอนการติดตั้งแพ็คเกจ Web API NuGet
  3. ติดตั้งแพ็คเกจ NuGet Web API (เบต้า) อีกครั้ง
  4. ตรวจสอบแล้วว่าไฟล์. csproj มีสำหรับแอสเซมบลีที่อ้างอิงทั้งหมดดังนั้นไฟล์จะถูกนำมาจากโฟลเดอร์ Bin เสมอแทนที่จะเป็น GAC

1
โครงการของฉันเริ่มได้ผล แต่ฉันไม่รู้ว่าทำไม ... แนวทางของคุณดูเป็นไปได้
Remy

alexanderb - ฉันจะเปลี่ยนเป็นโปรไฟล์. NET 4.0 ได้อย่างไร ใน Visual Studio? โฟลเดอร์ bin อยู่ที่ไหน ไฟล์. csproj เป็นไฟล์ web.config หรือไม่ Thx
WhoAmI

114

ฉันมีข้อผิดพลาดเดียวกันขณะปรับใช้เว็บแอปที่แปลงก่อนหน้านี้ (จาก. NET 4.5 ถึง 4.0) บน IIS 6.0

ในส่วนรันไทม์ web.config ฉันพบ

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

ที่ฉันเปลี่ยนเป็น

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

ตอนนี้ใช้งานได้เหมือนมีเสน่ห์


4
ควรตั้งค่าแอสเซมบลีให้คัดลอกในเครื่องด้วยการเปลี่ยนแปลงนี้หรือไม่
Rasmus Christensen

3
ปัญหาสำหรับฉันคือหนึ่งในแพ็คเกจ Web Api NuGet ของฉันมีการพึ่งพา System.Net.Http 2.0.0.0 แต่การอ้างอิงของฉันที่ฉันมีคือ 2.1.10.0 ที่ถูกส่งออกไปยังโฟลเดอร์ bin ของฉัน
JustinMichaels

2
สิ่งนี้ถูกต้อง (ตามที่ Justin Michaels กล่าว) การอ้างอิงหมายถึง 2.0.0.0 แต่การอ้างอิงแอสเซมบลีของคุณคือ 2.1.xx สิ่งที่คุณต้องแก้ไขคือการเปลี่ยนเส้นทาง
Tod Thomson

2
คำตอบนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง ฉันเดาว่านั่นคือเหตุผลที่ผู้ใช้คนอื่น ๆ ทั้งหมดผลักดันตัวเลือกนี้ ขอบคุณ Krzysztof!
Blaise

3
ปัญหาอาจไม่ใช่การอ้างอิงโดยตรงไปยัง System.Net.Http แต่เป็นการอ้างอิงทางอ้อมที่ใช้ในไลบรารีอื่น ๆ ที่คุณอ้างถึง นั่นเป็นเหตุผลที่การตั้งค่า copy local โดยทั่วไปไม่สามารถแก้ไขปัญหานี้ได้
Paul Keister

10

เหมืองทำงานร่วมกับ:

สังเกตการเปลี่ยนเส้นทางของ 1-4 ถึง 2.0

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

ฉันทำอะไรบางอย่างเช่นนี้ แต่ฉันอัปเดต newVersion เป็น 4.0.0.0 และทิ้ง oldVersion เป็น 0.0.0.0-2.0.0.0
Veritoanimus

2

ในโฟลเดอร์การอ้างอิงของโปรเจ็กต์ของคุณควรมีการอ้างอิงถึง dll นี้และเวอร์ชันควรเป็น 2.0.0.0 ตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็น Copy Local = true จากนั้นตรวจสอบให้แน่ใจว่าพบทางไปยังโฟลเดอร์ bin ของแอปเซิร์ฟเวอร์ของคุณ

นี่คือหนึ่งในไลบรารีที่ตอนนี้จัดการโดย nuget ดังนั้นเปิด Nuget และตรวจสอบให้แน่ใจว่าทุกอย่างเป็นปัจจุบัน และในไดเร็กทอรีแพ็กเกจโปรเจ็กต์ของคุณไฟล์ควรอยู่ที่นี่: \packages\System.Net.Http.2.0.20126.16343\lib\net40

คุณสามารถลองสร้างแอป MVC4 ใหม่และดูว่าไฟล์นั้นปรากฏขึ้นสำหรับแอปนั้นหรือไม่


1
จริงๆแล้วนั่นคือสิ่งที่ทำให้ฉันสับสน ฉันใช้ nuget และฉันมีโฟลเดอร์นี้ แต่ถ้าฉันดูที่ System.Net.Http มันมีเวอร์ชัน 1.0.0.0
Remy

1
นี่คือวิธีที่ฉันแก้ไข! เนื่องจากทั้งหมดทำงานในพื้นที่ ฉันเพียงแค่คลิกขวาอ้างอิงและในคุณสมบัติของฉันได้ตั้งCopy localเพื่อความจริงซึ่งจะช่วยแก้ปัญหามัน! ง่ายขึ้น / ดีขึ้นแล้วยุ่งกับไฟล์ web.config เพียงเพิ่ม dll ลงในโฟลเดอร์ bin ของคุณ
JP Hellemons

2

ในกรณีของฉันฉันแก้ไขมันด้วยวิธีที่ง่ายกว่ามากเพียงแค่ให้ HintPath กับการอ้างอิงถึงแพ็คเกจ nuget:

     <Reference Include="System.Data.Entity" />
     <Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
       <Private>True</Private>
+      <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll</HintPath>
     </Reference>
     <Reference Include="System.Net.Http.WebRequest, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
       <Private>True</Private>
+      <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.WebRequest.dll</HintPath>
     </Reference>
     <Reference Include="System.Numerics" />
     <Reference Include="System.Security" />

1

ในกรณีของฉันฉันเพิ่มการอ้างอิงลงใน System.Net.Http เวอร์ชัน 2.1.10.0 ผ่าน NuGet โดยไม่ได้ตั้งใจ ฉันไม่สามารถกำจัดมันใน NuGet Package Manager ได้ (เพราะแพ็คเกจอื่นดูเหมือนจะขึ้นอยู่กับมัน) อย่างไรก็ตามแพ็คเกจเหล่านั้นไม่ได้ขึ้นอยู่กับเวอร์ชันนี้โดยเฉพาะ นี่คือสิ่งที่ฉันทำเพื่อกำจัดมัน (คุณสามารถใช้คอนโซล NuGet แทนได้ (โดยใช้พารามิเตอร์ –force):

  • เปลี่ยนเวอร์ชันของ Microsoft.Net.Http ใน package.config จาก 2.1.10.0 เป็น 2.0.0.0
  • ถอนการติดตั้ง BCL Portability Pack ใน NuGet Package Manager
  • กำจัดไลบรารีที่พึ่งพาด้วยตนเอง (System.Net.Http. * ซึ่งมีเวอร์ชัน 2.1.10.0)
  • เพิ่มการอ้างอิงไปยัง System.Net.Http 2.0.0.0

1

ในไฟล์ config ฉันลบแอสเซมบลีที่ขึ้นอยู่กับ:

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

ตอนนี้ใช้งานได้ดี


หากต้องการแสดงแท็ก XML อย่างถูกต้องให้จัดรูปแบบข้อความของคุณเป็นรหัส เพียงแค่เพิ่มช่องว่างสี่ช่องก่อนแต่ละบรรทัด
Artemix

Tnx Artemix นี่คือความคิดเห็นแรกของฉัน)
StefanoM5

1

ฉันประสบปัญหานี้ในเซิร์ฟเวอร์ทดสอบ (Windows 2008 R2) ซึ่งคาดว่า "พร้อม" สำหรับการปรับใช้งาน;)

คำใบ้คือเมื่อฉันตรวจสอบเวอร์ชันของ System.net ระหว่างเครื่อง DEV และเซิร์ฟเวอร์การปรับใช้ของฉันไม่ตรงกัน

แก้ไขโดยใช้ขั้นตอนด้านล่าง:

  1. ดาวน์โหลดตัวติดตั้ง. NET Framework 4.5 แบบสแตนด์อโลนจากที่นี่

  2. เรียกใช้โปรแกรมติดตั้งบนเครื่องปรับใช้

โพสต์การติดตั้งเฟรมเวิร์กเซิร์ฟเวอร์ต้องการรีบูตเช่นนั้นและ volla ก็เช่นกัน! เราไปกันดีกว่า !!


1

เราใช้ VS 2013 สร้าง MVC 4 Web API ใหม่และมีปัญหากับ system.net.http.dll ไม่ใช่เวอร์ชันที่ถูกต้องเมื่อสร้างบนเซิร์ฟเวอร์ TeamCity ของเรา แต่สร้างได้ดีบนเครื่องนักพัฒนาท้องถิ่นของเราที่มี VS 2013 ติดตั้ง

ในที่สุดเราก็กำหนดปัญหา

เมื่อสร้าง MVC 4 Web API ใหม่และเลือกเฟรมเวิร์ก 4.0 ในการสร้างโปรเจ็กต์เราพบว่ามีการใส่เวอร์ชันแพ็กเกจ NuGet ที่ถูกต้องสำหรับ DLL: .. \ package \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \ System.Net.Http.dll

อย่างไรก็ตามไฟล์. csproj สำหรับโครงการนี้กล่าวว่าเส้นทางสำหรับไฟล์ system.net.http.dll นี้คือ .. \ package \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll

ดังนั้นเมื่อพยายามสร้างจะล้มเหลวในความแตกต่างของเส้นทางนี้ แต่กำลังค้นหาเวอร์ชันเฟรมเวิร์กที่ถูกต้องของไฟล์ที่อื่นในเครื่องนักพัฒนา แต่ไม่พบบนเซิร์ฟเวอร์การสร้าง TeamCity ของเรา

จนถึงตอนนี้นี่คือความแตกต่างเดียวที่เราพบ การเปลี่ยนเส้นทางในไฟล์. csproj และการสร้างบนเครื่อง Dev ในเครื่องด้วย VS2013 ยังคงใช้งานได้

การตรวจสอบว่าในการควบคุมเวอร์ชันและการมีเซิร์ฟเวอร์การสร้าง TeamCity ของเรา (โดยไม่ได้ติดตั้ง VS 2013 ในเครื่อง) จะพบเวอร์ชันที่ถูกต้องของ. dll ในโฟลเดอร์แพ็คเกจ NuGet สำหรับโซลูชันและสร้างได้สำเร็จแทนที่จะค้นหา system.net เวอร์ชันอื่น .dll และค้นหาเวอร์ชันที่ใหม่กว่าซึ่งไม่ตรงกับกรอบงานจึงทำให้การสร้างล้มเหลว

ไม่แน่ใจว่าจะช่วยได้หรือไม่

ตรวจสอบเส้นทางไฟล์โครงการของคุณสำหรับ DLL และตรวจสอบให้แน่ใจว่าตรงกับเส้นทางโฟลเดอร์แพ็คเกจของคุณสำหรับ DLL


1

เพียงทำให้คำตอบอื่น ๆ ง่ายขึ้นสำหรับสิ่งที่ได้ผลสำหรับฉัน

ฉันไปที่ผู้จัดการ NuGet ถอนการติดตั้งแพ็คเกจที่เกี่ยวข้อง (ในกรณีของฉันคือ "Microsoft ASP.NET Web API 2.1 Client Libraries" และ "Json.NET") และติดตั้งใหม่ ใช้เวลาเพียงไม่กี่คลิก


0

ปิดโปรเจ็กต์เปิดอีกครั้ง จากนั้น Clean Solution + Build ใช้ได้ผลสำหรับฉัน


0

สำหรับเวอร์ชัน 2.2.15.0 ฉันทำสิ่งนี้:

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

0

ฉันมีปัญหาเดียวกันนี้แน่นอน! ฉันดูที่แท็บคำเตือนของฉันใน VS และสังเกตเห็นว่าหนึ่งในแพ็คเกจนักเก็ตของฉันมีการอ้างถึง. NETFramework เวอร์ชัน 4.5.0.0 โดยอ้อม ฉันต้องถอนการติดตั้งแพคเกจนี้แล้วติดตั้งเวอร์ชัน 4.0 ใหม่ แต่ต้องแน่ใจว่าได้ระบุเวอร์ชันของแพ็คเกจที่รองรับ 4.0 แล้ว (ค่าเริ่มต้นจะกลับเป็น 4.5 ฉันเชื่อว่าหากคุณไม่ได้ระบุเมื่อติดตั้งแพ็คเกจ) หวังว่านี่จะช่วยได้!


0

สิ่งนี้เกิดขึ้นบนเซิร์ฟเวอร์หลังการปรับใช้ มันเกิดจาก:

A) ไฟล์เก่าในโฟลเดอร์ bin ที่ยังคงค้างอยู่ซึ่งควรจะถูกลบไปแล้ว

หรือ

B) ไม่มีสิทธิ์เข้าถึงโฟลเดอร์สำหรับผู้ใช้ Application Pool Identity

กล่าวอีกนัยหนึ่งสำหรับเราสิ่งนี้ได้รับการแก้ไขโดยการแก้ไขสิทธิ์ในโฟลเดอร์สำหรับไซต์และลบโฟลเดอร์ bin ออกและปรับใช้ใหม่


0

ฉันมีปัญหาเดียวกันกับ Gembox.spreadsheet.dll เวอร์ชัน 31

"ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'GemBox.S spreadsheet, Version = 39.3.30.1095, Culture = neutral, PublicKeyToken = b1b72c69714d4847' หรือหนึ่งในการอ้างอิงคำจำกัดความของ manifest ของแอสเซมบลีที่อยู่ไม่ตรงกับการอ้างอิงแอสเซมบลี (ข้อยกเว้นจาก HRESULT: 0x80131040 )”

ฉันลองเกือบทุกอย่างจากบทความเหล่านี้ แต่ไม่มีเลย มันได้รับการแก้ไขด้วยขั้นตอนง่ายๆ

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


0

ไปที่ปัญหาที่คล้ายกันและคำสั่งที่กล่าวถึงในหลายความคิดเห็นทำงานได้ดี

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

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


0

สำหรับข้อผิดพลาดนี้ (และที่คล้ายกัน) ควรดำเนินการผ่าน NuGet Consolidate (โซลูชัน> จัดการแพ็คเกจ NuGet ... บนส่วนประกอบที่เก่ากว่าอื่น ๆ ใช้ร่วมกับ Updates ได้อย่างตรงไปตรงมาและสามารถช่วยลดความเจ็บปวดได้มาก

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

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