Không thể tải tệp hoặc lắp ráp 'System.Net.Http, Phiên bản = 2.0.0.0 trong API Web MVC4


92

Tôi có một chút vấn đề kỳ lạ.
Tôi đã phát triển một ứng dụng với MVC 4 và API Web mới và nó hoạt động tốt tại địa phương. Tôi đã cài đặt MVC4 trên máy chủ và triển khai ứng dụng. Bây giờ tôi gặp lỗi sau:

Không thể tải tệp hoặc lắp ráp 'System.Net.Http, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = 31bf3856ad364e35' hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của hội đồng định vị không khớp với tham chiếu hợp ngữ. (Ngoại lệ từ HRESULT: 0x80131040)

Mô tả: Một ngoại lệ chưa được xử lý đã xảy ra trong quá trình thực hiện yêu cầu web hiện tại. Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về lỗi và lỗi bắt nguồn từ đâu

Thật buồn cười, phiên bản System.Net.Http mà tôi có cục bộ trong thư mục gói của mình hoặc trong thư mục ASP.NET MVC 4 \ Assemblies là 1.0.0.0. Tôi thực sự đã xóa tham chiếu đến System.Net.Http khỏi dự án của mình, nhưng tôi vẫn nhận được thông báo tương tự. Tôi hơi bối rối về việc nó lấy tham chiếu 2.0.0.0 từ đâu và tại sao nó sẽ hoạt động cục bộ nhưng không hoạt động trên máy chủ.

Xem xét các phụ thuộc nuget:

ASP.NET WEb API Core Libraries (Beta) phụ thuộc vào System.Net.Http.Formatting.
Và System.Net.Http.Formatting phụ thuộc vào System.Net.Http.
Tôi đoán đó là nguyên nhân của điều này. Nhưng tôi đã cài đặt Phiên bản 2.0.20126.16343 của gói này, chỉ là dll bên trong có phiên bản 1.0.0.0

Tui bỏ lỡ điều gì vậy?

CẬP NHẬT:

Đây là một ứng dụng con của một ứng dụng ASP.NET khác, nhưng ứng dụng còn lại vẫn dựa trên WebForms. Vì vậy, một cái gì đó đang trở nên lộn xộn. Nhưng nếu tôi làm sạch phần lắp ráp trong web.config nếu không tìm thấy chính ứng dụng đó nữa.


Bạn đã sử dụng tính năng "Thêm phần phụ thuộc có thể triển khai" cho dự án này chưa?
ChristiaanV

Không, không thử điều đó. Nhưng tôi đã đặt tất cả mọi thứ lên tươi và bây giờ nó hoạt động .... Không thực sự thỏa mãn, nhưng ...
Remy

Tôi gặp sự cố này mỗi khi khởi động lại máy và khởi chạy lại visual studio. Bằng cách nào đó nó biến mất nếu tôi làm sạch và sau đó xây dựng lại dung dịch.
frostshoxx

Câu trả lời:


30

Tôi đã gặp vấn đề tương tự khi triển khai ứng dụng của mình lên appharbor. Vấn đề là nó chưa hỗ trợ .NET 4.5. Tôi đã làm gì.

  1. Đã chuyển dự án của tôi sang hồ sơ .NET 4.0.
  2. Gói NuGet Web API đã gỡ cài đặt.
  3. Đã cài đặt lại gói NuGet Web API (Beta).
  4. Đã xác minh rằng tệp .csproj chứa TẤT CẢ các hội đồng được tham chiếu, vì vậy nó sẽ luôn lấy nó từ thư mục Bin, thay vì GAC.

1
Bằng cách nào đó dự án của tôi bắt đầu hoạt động, nhưng tôi không biết tại sao ... Cách tiếp cận của bạn có vẻ khả thi.
Remy

alexanderb - làm cách nào để chuyển sang cấu hình .NET 4.0. Trong Visual Studio? Thư mục bin nằm ở đâu? Tệp .csproj có phải là tệp web.config không? Thx
WhoAmI

114

Tôi đã gặp lỗi tương tự khi triển khai ứng dụng web được chuyển đổi trước đó (từ .NET 4.5 sang 4.0) trên IIS 6.0.

Trong phần thời gian chạy web.config tôi đã tìm thấy

<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>

mà tôi đã đổi thành

<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>

Bây giờ hoạt động như sự quyến rũ.


4
Có nên thiết lập các hội đồng để sao chép cục bộ với thay đổi này không?
Rasmus Christensen

3
Vấn đề đối với tôi là một trong các gói Web Api NuGet của tôi phụ thuộc vào System.Net.Http 2.0.0.0 nhưng tham chiếu của tôi mà tôi có là 2.1.10.0 đang được xuất vào thư mục bin của tôi.
JustinMichaels

2
Điều này là chính xác (như Justin Michaels đã nói). Sự phụ thuộc đề cập đến 2.0.0.0 nhưng tham chiếu hợp ngữ của bạn là 2.1.xx Tất cả những gì bạn cần khắc phục là chuyển hướng ràng buộc.
Tod Thomson,

2
Câu này nên được đánh dấu là câu trả lời đúng. Tôi đoán đó là lý do tại sao tất cả những người dùng khác đang đẩy mạnh tùy chọn này. Cảm ơn bạn, Krzysztof!
Blaise

3
Vấn đề có lẽ không phải là tham chiếu trực tiếp đến System.Net.Http, mà là tham chiếu gián tiếp được sử dụng trong một trong các thư viện khác mà bạn đang tham chiếu. Đó là lý do tại sao cài đặt bản sao cục bộ nói chung sẽ không khắc phục được sự cố này.
Paul Keister

10

Tôi đã làm việc với:

Lưu ý chuyển hướng từ 1-4 đến 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>

Tôi đã làm một cái gì đó likethis, nhưng tôi đã cập nhật newVersion lên 4.0.0.0 và để lại oldVersion là 0.0.0.0-2.0.0.0
Veritoanimus

2

Trong thư mục Tham chiếu của dự án của bạn phải có một tham chiếu đến dll này và phiên bản phải là 2.0.0.0. Đảm bảo điều này được đặt thành Copy Local = true. Và sau đó đảm bảo rằng nó tìm thấy đường đến thư mục bin của ứng dụng máy chủ của bạn.

Đây là một trong những thư viện hiện được quản lý bởi nuget. Vì vậy, hãy mở Nuget và đảm bảo rằng mọi thứ đều được cập nhật. Và trong thư mục các gói dự án của bạn, tệp sẽ ở đây: \packages\System.Net.Http.2.0.20126.16343\lib\net40

Bạn cũng có thể thử tạo một ứng dụng MVC4 mới và xem liệu tệp có hiển thị cho ứng dụng đó hay không.


1
Thực ra đó là điều khiến tôi bối rối. Tôi sử dụng nuget và tôi có thư mục này. Nhưng nếu tôi nhìn vào System.Net.Http thì nó có Phiên bản 1.0.0.0
Remy

1
Đây chính xác là cách tôi đã sửa nó! Vì tất cả đều hoạt động tại địa phương. Tôi chỉ cần nhấp chuột phải vào tham chiếu và trong thuộc tính, tôi đã đặt Copy localthành true để giải quyết nó! dễ dàng hơn / tốt hơn sau đó lộn xộn trong các tệp web.config. Chỉ cần thêm dll vào thư mục bin của bạn.
JP Hellemons

2

Trong trường hợp của tôi, tôi đã sửa nó theo cách dễ dàng hơn nhiều, chỉ cần cung cấp một HintPath cho tham chiếu đến gói 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

Trong trường hợp của tôi, tôi đã vô tình thêm phần phụ thuộc vào System.Net.Http phiên bản 2.1.10.0 thông qua NuGet. Tôi không thể loại bỏ nó trong Trình quản lý gói NuGet (vì các gói khác dường như phụ thuộc vào nó). Tuy nhiên, những gói đó không phụ thuộc vào phiên bản cụ thể này. Đây là những gì tôi đã làm để loại bỏ nó (bạn cũng có thể sử dụng bảng điều khiển NuGet thay thế (sử dụng tham số –force):

  • Thay đổi phiên bản Microsoft.Net.Http trong package.config từ 2.1.10.0 thành 2.0.0.0
  • Gỡ cài đặt BCL Portability Pack trong NuGet Package Manager
  • Loại bỏ thủ công các thư viện phụ thuộc (System.Net.Http. * Có phiên bản 2.1.10.0)
  • Thêm tham chiếu đến System.Net.Http 2.0.0.0

1

Trong cấu hình tệp, tôi đã xóa Assembly phụ thuộc:

<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>

Bây giờ nó hoạt động tốt.


Để hiển thị đúng các thẻ XML - hãy định dạng văn bản của bạn dưới dạng mã. Đối với điều này, chỉ cần thêm bốn dấu cách trước mỗi dòng.
Artemix,

Tnx Artemix, đây là nhận xét đầu tiên của tôi;)
StefanoM5

1

Tôi đã gặp phải sự cố này trên một máy chủ thử nghiệm (Windows 2008 R2) được cho là "sẵn sàng" để triển khai;)

Gợi ý là khi tôi kiểm tra các phiên bản của System.net giữa máy DEV và máy chủ triển khai, chúng không khớp.

Đã sửa bằng các bước bên dưới:

  1. Đã tải xuống trình cài đặt .NET Framework 4.5 độc lập từ ĐÂY

  2. Chạy trình cài đặt trên máy triển khai

Sau khi cài đặt khung công tác, máy chủ muốn khởi động lại, điều đó đã làm và volla! Chúng tôi rất tốt để đi !!


1

Chúng tôi đang sử dụng VS 2013, đã tạo một API Web MVC 4 mới và gặp sự cố với system.net.http.dll không phải là phiên bản chính xác khi được tạo trên máy chủ TeamCity của chúng tôi nhưng nó hoạt động tốt trên các máy nhà phát triển cục bộ của chúng tôi có VS 2013 Cài đặt.

Cuối cùng chúng tôi cũng xác định được vấn đề.

Khi tạo một API Web MVC 4 mới và chọn khuôn khổ 4.0 khi tạo dự án, chúng tôi đã tìm thấy phiên bản gói NuGet chính xác cho DLL đang được đưa vào: .. \ package \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \ System.Net.Http.dll

Tuy nhiên, tệp .csproj cho dự án này cho biết đường dẫn cho tệp system.net.http.dll này là: .. \ package \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll

Vì vậy, khi cố gắng xây dựng không thành công trên sự khác biệt về đường dẫn này nhưng đang tìm thấy phiên bản khung chính xác của tệp ở nơi khác trên máy của nhà phát triển chứ không phải trên máy chủ xây dựng TeamCity của chúng tôi.

Cho đến nay đây là sự khác biệt duy nhất mà chúng tôi tìm thấy. Thay đổi đường dẫn trong tệp .csproj và xây dựng trên máy Dev cục bộ với VS2013 vẫn hoạt động.

Kiểm tra điều đó trong kiểm soát phiên bản và có máy chủ xây dựng TeamCity của chúng tôi (không có VS 2013 được cài đặt cục bộ) hiện tìm thấy phiên bản chính xác của tệp .dll trong thư mục gói NuGet của nó cho giải pháp và xây dựng thành công thay vì tìm kiếm phiên bản khác của system.net.http .dll và tìm phiên bản mới hơn không phù hợp với khuôn khổ do đó gây ra lỗi xây dựng.

Không chắc chắn nếu điều này giúp ích.

Kiểm tra đường dẫn tệp dự án của bạn cho DLL và đảm bảo rằng nó khớp với đường dẫn thư mục gói của bạn cho DLL.


1

Chỉ đơn giản hóa các câu trả lời khác cho những gì hiệu quả với tôi.

Tôi đã đến trình quản lý NuGet, gỡ cài đặt các gói liên quan (Trong trường hợp của tôi, "Thư viện máy khách Microsoft ASP.NET Web API 2.1" và "Json.NET") và cài đặt lại chúng. Chỉ mất một vài cú nhấp chuột.


0

Đóng dự án, Mở lại. Sau đó, Giải pháp sạch + Xây dựng. Làm việc cho tôi


0

Đối với phiên bản 2.2.15.0, tôi đã làm điều này:

<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

Tôi đã có cùng một vấn đề này! Tôi đã xem qua tab Cảnh báo của mình trong VS và nhận thấy rằng một trong các gói nuget của tôi đang tham chiếu CHỈ ĐÚNG .NETFramework Phiên bản 4.5.0.0. Tôi đã phải gỡ cài đặt gói này và sau đó cài đặt lại phiên bản 4.0 nhưng hãy nhớ chỉ định các phiên bản gói hỗ trợ 4.0 (tôi tin rằng nó sẽ mặc định trở lại 4.5 nếu bạn không chỉ định khi cài đặt gói). Hi vọng điêu nay co ich!


0

Chúng tôi đã có điều này xảy ra trên một máy chủ sau khi triển khai. Nó được gây ra bởi:

A) Các tệp cũ trong thư mục thùng rác vẫn nằm xung quanh đó đáng lẽ đã bị xóa

hoặc là

B) Không có quyền truy cập đọc vào thư mục cho người dùng Nhận dạng Nhóm Ứng dụng.

Nói cách khác, đối với chúng tôi, điều này đã được giải quyết bằng cách sửa quyền đối với các thư mục cho trang web và xóa thư mục bin và triển khai lại.


0

Tôi đã gặp vấn đề tương tự với Gembox.spreadsheet.dll phiên bản 31.

"Không thể tải tệp hoặc lắp ráp 'GemBox.S Spreadsheet, Phiên bản = 39.3.30.1095, Văn hóa = trung lập, PublicKeyToken = b1b72c69714d4847' hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của lắp ráp được định vị không khớp với tham chiếu hợp ngữ. (Ngoại lệ từ HRESULT: 0x80131040 ) "

Tôi đã thử hầu hết mọi thứ từ những bài báo này và không có bài nào hoạt động. Nó chỉ được sửa với bước đơn giản.

Tôi đã thử xây dựng các dự án riêng lẻ về cơ bản thiết lập tham chiếu phiên bản chính xác cho dll và lỗi đã hoàn toàn biến mất khỏi giải pháp.


0

Gặp vấn đề tương tự và chỉ thị được đề cập trong nhiều bình luận đã hoạt động tốt

<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>

Mặc dù vậy, bạn phải đảm bảo mức độ phù hợp của phiên bản cũ đủ cao nếu không các phiên bản mới hơn có thể không được chuyển hướng đến phiên bản cụ thể mà bạn cần và vị trí sử dụng tham chiếu mới hơn đó sẽ không hoạt động bình thường vì tham chiếu cũ hơn đã nằm trong thư mục bin.


0

Đối với lỗi này (và tương tự), bạn nên đi qua NuGet Hợp nhất (Giải pháp> Quản lý Gói NuGet ...) để đảm bảo các phiên bản thành phần được tham chiếu giống nhau nhất quán trong mỗi thư viện lớp được tham chiếu trong giải pháp, vì ngay cả phiên bản cũ hơn một chút cũng có thể có các phụ thuộc trên các thành phần cũ hơn khác. Nó đơn giản để sử dụng cùng với Cập nhật và có thể giúp tiết kiệm rất nhiều.

Điều này đã giải quyết vấn đề này cho tôi và tôi sẽ nói rằng đó là điều bắt buộc phải làm quen nếu bạn đang tạo thư viện trợ giúp cũng tham chiếu MVC hoặc các thành phần NuGet dựa trên web khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.