Không thể tải tập tin hoặc lắp ráp, System System.H.H, Phiên bản = 4.0.0.0, Culture = trung tính, PublicKeyToken = b03f5f7f11d50a3a mộng


165

Tôi đã sao chép dự án của mình vào một máy Windows 10 sạch chỉ với Visual Studio 2015 Community và SQL Server 2016 Express được cài đặt. Không có phiên bản khung nào khác được cài đặt ngoài các phiên bản được cài đặt với Windows 10 và VS2015 hoặc SQL Server.

Khi tôi cố gắng bắt đầu dự án WebApi, tôi nhận được thông báo:

Không thể tải tệp hoặc lắp ráp "System.Net.Http, Version = 4.0.0.0, Culture = trung tính, PublicKeyToken = b03f5f7f11d50a3a" hoặc một trong các phụ thuộc của nó. Hệ thống không thể tìm thấy các tập tin được chỉ định.

Các gói của dự án bao gồm:

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />

Sau khi xây dựng dự án với .NET Framework 4.6.1, System.Net.Httpkhông tìm thấy tệp trong binthư mục.

Đường dẫn của tệp trỏ đến:

C: \ Tệp chương trình (x86) \ Tập hợp tham chiếu \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Net.Http.dll

Đường dẫn của tệp System.Net.Http.Formattingtới:

C: \ Development \ MyApp \ gói \ Microsoft.AspNet.WebApi.Client.5.2.3 \ lib \ net45 \ System.Net.Http.Formatted.dll

Toàn bộ dự án mục tiêu 4.5.1 hay có cách nào khác để tham khảo các hội đồng phù hợp?


Bạn đã thử cài đặt lại Api Web từ gói NuGet chưa?
Mihai Alexandru-


Đã thử tất cả các câu trả lời được đề xuất trong câu hỏi SO đó. Không có gì hoạt động cho đến nay. Tôi cũng đã chạy update-package xxx -reinstallcho tất cả các gói nuget tôi đang sử dụng. Nó cũng không hoạt động.
Ivan-Mark Debono 16/07/2016


Chỉ cần tham khảo điều này, cảm ơn tôi sau stackoverflow.com/questions/50536842/
trộm

Câu trả lời:


112

Thực hiện theo các bước sau,

  1. Cập nhật phòng thu trực quan lên phiên bản mới nhất (nó quan trọng)
  2. Xóa tất cả các chuyển hướng ràng buộc khỏi web.config
  3. Thêm phần này vào .csprojtập tin:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Xây dựng dự án
  5. Trong binthư mục nên có một (WebAppName).dll.configtập tin
  6. Nó nên có chuyển hướng trong đó, sao chép chúng vào web.config
  7. Loại bỏ các snipped ở trên từ .csprojtập tin

Nó nên hoạt động


1
Bây giờ tôi đang nhận Không thể tải tệp hoặc lắp ráp 'Newtonsoft.Json, Phiên bản = 6.0.0.0, Culture = trung tính, PublicKeyToken = 30ad4fe6b2a6aeed' hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của cụm lắp ráp không khớp với tham chiếu lắp ráp. (Ngoại lệ từ HRESULT: 0x80131040)
EK_AllDay

2
Bạn phải nhớ sao chép qua các chuyển hướng ràng buộc từ tệp được tạo, vì vậy lần đầu tiên bạn sẽ gặp lỗi ở trên, nhưng hãy xem thư mục bin để lấy (webappname) đã tạo như mô tả ở trên, sao chép toàn bộ danh sách các chuyển hướng vào web.config của bạn, sau đó biên dịch lại. Điều này thực sự giúp ích cho tôi, hãy chắc chắn rằng bạn sử dụng công cụ hợp nhất nuget để dọn sạch càng nhiều tài liệu tham khảo càng tốt.
Chris Schaller

4
Kinh ngạc. Điều này thực sự làm việc cho tôi. @EK_AllDay Bạn phải sao chép Hội đồng trở lại vào web.config ban đầu.
David De Sloovere

3
Huy hiệu huyền thoại xứng đáng ngay tại đây! Chỉ là một ghi chú bên lề, khi tôi sao chép Hội đồng lại vào web.config, tôi thấy rằng không còn ràng buộc nào cho System.Net.Http . Vì vậy, chúng tôi giả định rằng VS hiện đang sử dụng lắp ráp mặc định được đóng gói với khung .Net, thay vì phiên bản của chính nó?
EvilDr

1
Câu trả lời này đã cứu tôi rất nhiều lần tôi thậm chí đã ngừng đếm. Nên được đánh dấu là câu trả lời IMHO.
Sebastian Budka

258

Thay đổi thông tin ràng buộc trong web.config (hoặc app.config) của tôi - trong khi "hack" theo quan điểm của tôi, cho phép bạn tiếp tục với dự án của mình sau khi cập nhật gói NuGet đánh cắp ứng dụng của bạn và cung cấp cho bạn System.Net.Http lỗi.

Đặt newVersion = "4.0.0.0"

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

4
Tôi đã triển khai lên Azure, một lần, không có vấn đề gì, sau đó 15 phút, một lần triển khai liên tiếp đã cho tôi lỗi chính xác được nêu trong OP và điều chỉnh web.config trên máy chủ với câu trả lời chính xác này đã khắc phục sự cố của tôi. Nhưng, tôi không biết tại sao nó lại hoạt động lần đầu tiên. Tôi đã không gây rối với sự phụ thuộc của mình giữa các lần triển khai.
bkwdesign

8
Làm tốt lắm. Tôi có thể thấy những gì đã xảy ra, tôi đã cài đặt một gói trong một dự án miền cơ sở mà tôi khá chắc chắn đã cài đặt System.Net.Http nuget (có thể là phiên bản 4.1.x cao hơn) và ngay khi tôi làm điều đó tôi đã nhận được những thứ này cảnh báo ở khắp mọi nơi. Điều này đã khắc phục sự cố cho dự án web, nhưng lời khuyên ở trên của ai đó về việc tham khảo gói nuget cho tất cả các dự án đã loại bỏ tất cả các cảnh báo. Tôi có phải là người duy nhất quan tâm đến sự pha trộn của .NET cũ và mới mặc dù khi nói đến tài liệu tham khảo không? Nó làm cho tôi sợ tham chiếu các dlls địa phương điển hình như các gói nuget (dll hell).
Nicholas Petersen

3
Đây là câu trả lời của Microsoft về lý do tại sao đây là cách chính xác: github.com/dotnet/corefx/issues/25773
ghanashyaml

18
Loại bỏ các chuyển hướng ràng buộc hoàn toàn làm việc cho tôi.
sbkrogers

1
Có, chỉ cần xóa các dòng của system.net.http và system.r Yoon. Mọi thứ sau đó trở nên tốt đẹp.
ZZZ

32

Trong một trong các dự án của tôi, có một gói nuget với phiên bản cao hơn của System.Net.Http. và trong dự án khởi động của tôi có tham chiếu đến System.Net.Http v 4.0.0, tôi chỉ cài đặt gói nuget System.Net.Http trong dự án khởi động của mình và vấn đề đã được giải quyết


Tôi có ba dự án trong một giải pháp - hãy gọi cho họ A, BC. Alà dự án khởi động, và không có gì để làm với một trong hai Bhoặc C. Clà một dự án thử nghiệm cho B. Chạy thử nghiệm của tôi Ckhông thành công, vì tôi không có dự án tham khảo (System.Net.Http) A.
Rasmus Bækgaard

19

Thay đổi như sau:

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

với những điều sau đây:

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0" />

trong web.config


1
Bạn là một tay xã hội đen. Điều này đã giải quyết vấn đề của tôi!
Leonardo Wildt

1
Cảm ơn @LeonardoWildt
Muhammad Waqas

12

Nếu bạn có nhiều dự án trong giải pháp của mình, sau đó nhấp chuột phải vào biểu tượng giải pháp trong Visual Studio và chọn 'Quản lý gói NuGet cho Giải pháp', sau đó nhấp vào tab thứ tư 'Hợp nhất' để hợp nhất tất cả các dự án của bạn thành cùng một phiên bản của DLL. Điều này sẽ cung cấp cho bạn một danh sách các hội đồng tham chiếu để hợp nhất. Bấm vào từng mục trong danh sách, sau đó bấm cài đặt trong tab xuất hiện bên phải.


4
Kết hợp điều này với câu trả lời từ @sajeetharan về việc sử dụng AutoGenerateBindingRedirects, có vẻ như các phiên bản cũ hơn của gói VS hoặc nuget có thể để lại các tuyên bố ràng buộc không chính xác. Làm sạch tốt có thể giúp rất nhiều.
Chris Schaller

11

Các ràng buộc-chuyển hướng trên không làm việc cho tôi vì vậy tôi nhận xét ra các tham chiếu đến System.Net.Httptrong web.config. Mọi thứ dường như hoạt động tốt mà không có nó.

  <system.web>
    <compilation debug="true" targetFramework="4.7.2">
      <assemblies>
        <!--<add assembly="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />-->
        <add assembly="System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <httpRuntime targetFramework="4.7.2" />
  </system.web>

1
Điều này hoạt động trong Visual Studio 2017 (15.9.4) và cho phép bạn xây dựng với gói NuGet System.Net.Http (4.3.4) thay vì tham chiếu trực tiếp đến DLL đi kèm với bản phát hành khung .NET 4.7.2. Để sử dụng tham chiếu được vận chuyển (không có phụ thuộc nào được giới thiệu) trong IDE, hãy làm điều này: 1) Xóa chuyển hướng ràng buộc web / app.config 2) Xóa gói NuGet cho System.Net.Http 3) Mở "Thêm tham chiếu mới" và liên kết trực tiếp bản dựng 4.2.0.0 mới đi kèm với .NET 4.7.
EnocNRoll - AnandaGopal Pardue

Điều này làm việc cho tôi trong VS2019, di chuyển một ứng dụng từ 4.6.1 đến 4.7.2
cklimowski

Tôi đã có một dự án ứng dụng giao diện điều khiển hoạt động như một webjob. Nó đã ném ngoại lệ đó khi tạo một ứng dụng api SendGrid. Mọi thứ bắt đầu hoạt động sau khi xóa chuyển hướng ràng buộc khỏi app.config. Cảm ơn đã gợi ý điều này, tôi sẽ không bao giờ nghĩ.
Kurdemol94

9

Bạn có thể khắc phục điều này bằng cách nâng cấp dự án của bạn lên .NET Framework 4.7.2. Điều này đã được trả lời bởi Alex Ghiondea - MSFT . Hãy đi lên anh ấy như anh ấy thực sự xứng đáng!

Đây là một vấn đề được biết đến trong .NET Framework 4.7.1.

Như một giải pháp thay thế, bạn có thể thêm các mục tiêu này vào dự án của bạn. Họ sẽ xóa DesignFacadesToFilter khỏi danh sách các tham chiếu được truyền cho SGEN (và thêm chúng trở lại sau khi SGEN hoàn thành)

<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" />
    <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" 
        Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> 
    <ReferencePath Remove="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target>

<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <ReferencePath Include="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." />
</Target>

Một tùy chọn khác (máy rộng) là thêm chuyển hướng ràng buộc sau vào sgen.exe.config:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.

Câu trả lời cho câu hỏi liên kết ở trên bây giờ là câu trả lời có liên quan: stackoverflow.com/a/52883065/54289 Xem các bình luận về câu trả lời để biết chi tiết.
EnocNRoll - AnandaGopal Pardue

6

Điều này sẽ hoạt động trong .NET 4.7.2 với Visual Studio 2017 (15.9.4):

  • Xóa các chuyển hướng ràng buộc web / app.config
  • Xóa gói NuGet cho System.Net.Http
  • Mở "Thêm tham chiếu mới" và liên kết trực tiếp đến bản dựng 4.2.0.0 mới đi kèm với .NET 4.7.2

! [hình ảnh] (https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)


4

Tôi có cùng một vấn đề và cách duy nhất để tôi có thể sửa nó là thêm ràng buộcRedirect vào app.pring cách viết @ tripletdad99.

Nhưng nếu bạn có giải pháp với nhiều dự án thì thực sự là cập nhật mọi dự án bằng tay (và đôi khi sau khi cập nhật một số gói nuget bạn cần phải thực hiện lại). Và đó là lý do tại sao tôi đã viết tập lệnh powershell đơn giản mà nếu tất cả app.configs.

 param(
    [string]$SourceDirectory,
    [string]$Package,
    [string]$OldVersion,
    [string]$NewVersion
)

Write-Host "Start fixing app.config in $sourceDirectory"
Write-Host "$Package set oldVersion to $OldVersion and newVersion $NewVersion"
Write-Host "Search app.config files.."
[array]$files = get-childitem $sourceDirectory -Include app.config App.config -Recurse | select -expand FullName
foreach ($file in $files)
{
    Write-Host $file
    $xml = [xml](Get-Content $file)
    $daNodes = $xml.configuration.runtime.assemblyBinding.dependentAssembly
    foreach($node in $daNodes)
    {
        if($node.assemblyIdentity.name -eq $package)
        {
            $updateNode = $node.bindingRedirect
            $updateNode.oldVersion = $OldVersion
            $updateNode.newVersion =$NewVersion
            Write-Host "Fix"
        }
    }
    $xml.Save($file)
}

Write-Host "Done"

Ví dụ cách sử dụng:

./scripts/FixAppConfig.ps1 -SourceDirectory "C:\project-folder" -Package "System.Net.Http" -OldVersion "0.0.0.0-4.3.2.0" -NewVersion "4.0.0.0"

Có lẽ nó không hoàn hảo và cũng sẽ tốt hơn nếu ai đó liên kết nó với nhiệm vụ xây dựng trước.


3

4.6.1-2 trong VS2017 người dùng có thể gặp phải sự thay thế không mong muốn của phiên bản System.Net.Http của một VS2017 hoặc Msbuild 15 muốn sử dụng.

Chúng tôi đã xóa phiên bản này tại đây:

C: \ Tệp chương trình (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

và đây:

C: \ Tệp chương trình (x86) \ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

Sau đó, dự án được xây dựng với phiên bản mà chúng tôi đã tham chiếu qua NuGet.


1

Tôi đã có điều này, nhưng, đó là vì tôi đã thêm gói NuGet đã cập nhật các chuyển hướng ràng buộc. Khi tôi gỡ bỏ gói, các chuyển hướng vẫn còn đó. Tôi đã xóa tất cả chúng, và sau đó chạy update-pack -reinstall. Điều này đã thêm các chuyển hướng chính xác.


0

Kiểm tra phiên bản khung .net.
Khung .net ban đầu của tôi là phiên bản cũ hơn.
Sau khi tôi cài đặt .net framework 4.6, vấn đề này sẽ tự động được giải quyết.


0

Đối với tôi, tôi đã thiết lập dự án của mình để chạy trên phiên bản mới nhất của .Net Framework (thay đổi từ .Net Framework 4.6.1 thành 4.7.2).

Mọi thứ đều hoạt động, không có lỗi và được xuất bản mà không có vấn đề, và chỉ là tình cờ tôi bắt gặp thông báo lỗi System.Net.Http, được hiển thị trong một yêu cầu API nhỏ, khó nhận thấy, nhưng khá quan trọng trên trang web tôi ' m làm việc trên.

Tôi quay trở lại 4.6.1 và mọi thứ đều ổn trở lại.


0

Cách duy nhất giải quyết vấn đề này một cách rõ ràng cho tôi (.NET 4.6.1) là không chỉ thêm một tham chiếu Nuget vào System.Net.Http V4.3.4 cho dự án thực sự sử dụng System.Net.Http, mà còn cho dự án khởi động (một dự án thử nghiệm trong trường hợp của tôi).

(Điều này thật lạ, bởi vì System.Net.Http.dll chính xác đã tồn tại trong thư mục bin của dự án thử nghiệm và .config assemblyBingings trông cũng ổn.)


0

Đang cập nhật một trang web cũ bằng cách sử dụng nuget (bao gồm cập nhật .Net và cập nhật MVC).

Tôi đã xóa tham chiếu System.Net.HTTP trong VS2017 (phiên bản 2.0.0.0) và thêm lại tham chiếu, sau đó hiển thị 4.2.0.0.

Sau đó, tôi đã cập nhật một tấn 'gói' bằng cách sử dụng nuget và nhận được thông báo lỗi, sau đó nhận thấy có gì đó đã đặt lại tham chiếu thành 2.0.0.0, vì vậy tôi đã gỡ bỏ và thêm lại một lần nữa và nó hoạt động rất tốt ... kỳ quái.

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.