Masalah aneh dengan System.Net.Http 4.2.0.0 tidak ditemukan


108

Saya memiliki masalah aneh, yang membuat saya gila…

Saya memiliki Proyek Perpustakaan Kelas sederhana (Full .NET Framework, 4.6.1) dengan kelas pembungkus untuk fungsionalitas di sekitar Cosmos DB. Oleh karena itu saya telah menambahkan Paket NuGet "Microsoft.Azure.DocumentDB" 1.19.1 ke proyek ini. Selain itu, saya memiliki referensi ke Paket NuGet 10.0.3 “Newtonsoft.Json”, serta beberapa Paket NuGet "Microsoft.Diagnostics.EventFlow. *".

Sejauh ini, semuanya terkompilasi tanpa kesalahan apa pun.

Tetapi segera setelah saya mencapai kelas pembungkus saya - dikonsumsi dari Layanan Fabric Stateless Service sederhana (Full .NET Framework 4.6.1) - dan mencoba untuk mengeksekusi baris kode berikut:

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

Saya mendapatkan kesalahan aneh ini saat runtime:

System.IO.FileNotFoundException terjadi HResult = 0x80070002
Pesan = Tidak dapat memuat file atau rakitan 'System.Net.Http, Versi = 4.2.0.0, Budaya = netral, PublicKeyToken = b03f5f7f11d50a3a' atau salah satu ketergantungannya. Sistem tidak dapat menemukan berkas yang dicari.
Sumber = StackTrace: di Microsoft.Azure.Documents.Client.DocumentClient.Initialize (Uri serviceEndpoint, ConnectionPolicy connectionPolicy, Nullable 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable1 dikehendakiConsistencyLevel)

Pengecualian Dalam 1: FileNotFoundException: Tidak dapat memuat file atau rakitan 'System.Net.Http, Versi = 4.0.0.0, Budaya = netral, PublicKeyToken = b03f5f7f11d50a3a' atau salah satu dependensinya. Sistem tidak dapat menemukan berkas yang dicari.

Saya sama sekali tidak tahu, mengapa perakitan System.Net.Http tidak ditemukan sama sekali - bahkan ada referensi perakitan di proyek perpustakaan kelas saya ke .Net Framework Assembly "System.Net.Http 4.0.0.0".

Yang juga tidak saya mengerti adalah, bahwa ada pengalihan pengikatan aneh ke 4.2.0.0 - dari mana asalnya? Untuk menyiasati yang satu ini, saya mencoba menambahkan pengalihan berikut ke app.config dari Service Fabric Service (yang memakan perpustakaan kelas):

Tapi tetap tidak ada perbedaan, saya masih mendapatkan error saat runtime.

Ada yang punya petunjuk? Ada yang pernah melihat masalah seperti itu?

Terima kasih dan salam, OliverB


3
Hai, OliverB! Apakah Anda menemukan solusi untuk masalah ini? Saya hanya menghadapi situasi yang sama dan ini adalah mimpi buruk :-(
pengguna1178399

@HansPassant yang tautannya rusak sekarang
reggaeguitar

Jawaban:


129

Masalah yang Anda hadapi terkait dengan Visual Studio, terutama 2017 yang dikirimkan bersama System.Net.Http v4.2.0.0. Namun, mengadopsi cara baru di mana setiap referensi harus dilakukan melalui NuGet, versi terbaru System.Net.Http4.3.3 berisi dll versi 4.1.1.2.

Masalahnya adalah bahwa VS pada waktu pembuatan dan pada waktu berjalan juga akan mengabaikan referensi Anda dan akan mencoba untuk merujuk DLL yang diketahuinya.

Bagaimana memperbaikinya:

  • pastikan bahwa setiap referensi ke System.Net.Http dilakukan melalui NuGet
  • Membangun kesalahan waktu: ubah ekstensi System.Net.Http.dll (atau pindahkan ke tempat lain ... pada dasarnya singkirkan) yang dikirimkan dengan VS 2017 ( c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\); jika Anda memiliki versi yang berbeda maka jalurnya akan sedikit berbeda, meskipun tidak banyak
  • Galat runtime: tambahkan pengalihan pengikatan perakitan

Jika Anda melihat online di google, Anda akan menemukan beberapa masalah terbuka dengan Microsoft tentang ini, jadi semoga mereka akan memperbaikinya di masa mendatang.

Semoga ini membantu.

Memperbarui:

Saat mencari beberapa perbaikan permanen untuk masalah ini agar bekerja pada agen build, perhatikan bahwa jika Anda bermigrasi ke model NuGet PackageReference (dalam .csprojbukan dalam packages.config) cenderung bekerja lebih baik. Berikut tautan ke panduan tentang cara melakukan peningkatan ini: https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference



6
Terima kasih banyak, sudah gila mencoba menyelesaikan ini selama beberapa jam terakhir!
Flinkman

22
Perlu diketahui bahwa masalah ini dapat diselesaikan dengan benar-benar menghapus bindingRedirects jika Anda bekerja dengan .NET 4.7.2.
Alternatex

1
Masalah yang sama hari ini saat meningkatkan ke 4.7.2. System.IO.Compression dan System.Runtime juga terpengaruh. Menghapus pengalihan pengikatan memecahkan masalah.
JB. Dengan Monica.

7
Iya! Akhirnya! Sesuai @Alternatex dan JB di atas, untuk 4.7.2 hapus bindingRedirects dan sekarang menjadi emas. Sungguh merepotkan untuk setiap pembaruan kerangka kerja yang mencari tahu lagu dan tarian rutin terbaru yang dibutuhkan untuk System.Net.Http.
Ted

76

Menghapus pengalihan binding berhasil untuk saya, Anda dapat mencoba menghapusnya:

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

2
Itu adalah salah satu hal pertama yang saya coba, tetapi tidak berhasil
OliverB

2
Menghapus bindingRedirect memecahkan masalah bagi saya. Tes unit tidak lulus dengan kesalahan yang sama seperti OP dan sekarang berhasil.
Edu

1
Apakah ini kode lengkapnya? Dan di mana tepatnya ini perlu ditambahkan? Semua bindingRedirects saya yang lain dibungkus dalam tagdependentAssembly
Flo

1
Ini bekerja dengan baik. Saya akan menambahkan, jika Anda memiliki banyak proyek dalam solusi Anda, pastikan Anda mengevaluasi semuanya dan menyelesaikannya menggunakan metode ini.
Skuter

1
Terima kasih. Terjebak pada masalah dari 2 hari ini. Berhasil !!!
Sagar Khatri

17

Tambahan untuk jawaban yang sudah diberikan @AndreiU dan cara mereproduksi kesalahan runtime secara lokal.

Saya mendapatkan kesalahan waktu proses di bawah ini saat menerapkan ke Azure, bukan secara lokal.

Tidak dapat memuat file atau assembly 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' atau salah satu dependensinya. Sistem tidak dapat menemukan file yang ditentukan. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" di Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n di Company.Project .BackOffice.Web.Controllers.OrderController..ctor () di C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: baris 30 \ r \ n di lambda_method ( Tutup) \ r \ n di System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (permintaan HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Ketik controllerType) "}} Budaya = netral, PublicKeyToken = b03f5f7f11d50a3a 'atau salah satu dependensinya. Sistem tidak dapat menemukan file yang ditentukan. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" di Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n di Company.Project .BackOffice.Web.Controllers.OrderController..ctor () di C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: baris 30 \ r \ n di lambda_method ( Tutup) \ r \ n di System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (permintaan HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Ketik controllerType) "}} Budaya = netral, PublicKeyToken = b03f5f7f11d50a3a 'atau salah satu dependensinya. Sistem tidak dapat menemukan file yang ditentukan. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" di Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n di Company.Project .BackOffice.Web.Controllers.OrderController..ctor () di C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: baris 30 \ r \ n di lambda_method ( Tutup) \ r \ n di System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (permintaan HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Ketik controllerType) "}}

Ketika saya mulai melihat rakitan, saya dapat melihat bahwa proyek web dan proyek layanan saya menargetkan versi yang berbeda System.Net.Http.

Proyek web:

masukkan deskripsi gambar di sini

Proyek layanan:

masukkan deskripsi gambar di sini

Sangat mudah untuk berpikir bahwa ini disebabkan oleh ketidakcocokan dalam versi tetapi kuncinya di sini adalah melihat kesalahannya The system cannot find the file specified..

Melihat properti jalur kita dapat melihat bahwa proyek web menargetkan perakitan .Net Framework sementara layanan menargetkan perakitan dari Visual Studio 2017. Karena server tidak menginstal Visual Studio 2017, galat runtime akan terjadi.

Jalur web:

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

Jalur layanan:

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

Sesuatu yang sederhana seperti pengaturan Copy Localuntuk truedapat memperbaiki masalah, namun tidak dalam semua kasus.

masukkan deskripsi gambar di sini

Untuk mereproduksi kesalahan di komputer lokal Anda, cukup hapus yang diperlukan System.Net.Http.dlldari folder khusus Visual Studio. Ini akan memberi Anda error runtime dan mungkin beberapa error build. Setelah ini diperbaiki semuanya harus berfungsi, setidaknya itu untuk saya.

Jika Anda telah menginstal System.Net.Httpmelalui NuGetperiksa perakitan mana yang digunakan dengan melihat .csprojversi. System.Net.Http 4.3.4memberikan perakitan berikut misalnya:

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

Jika Anda menggunakan server build seperti Jenkins, TeamCity, atau AppVeyor, runtime yang hilang .dllmungkin juga ada di sana. Dalam hal ini mungkin tidak membantu untuk menggunakan versi NuGet dari System.Net.Http atau menghapus yang hilang .dllsecara lokal. Untuk mengatasi kesalahan ini, lihat versi yang tidak ditemukan dan spesifik PublicKeyToken. Setelah itu buat pengalihan binding di salah satu Web.configatau App.configbergantung pada project Anda. Dalam kasus saya, saya ingin menggunakan 4.0.0.0 sebagai gantinya:

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

Utas Github yang bagus tentang masalah ini:

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


4
menambahkan <dependentAssembly> <assemblyIdentity name = "System.Net.Http" ....... bekerja dari saya. terima kasih
Romeo

Untukku juga! Terima kasih atas solusinya! oldVersion = "0.0.0.0-4.2.0.0" newVersion = "4.1.1.3" karena saya menggunakan 4.1.1.3
Pavel Yermalovich

Pengalihan ke 4.0.0.0 inilah yang membuat saya berada di puncak. Terima kasih!
Jim G.

Berbahaya untuk mengalihkan ke bawah! Anda memiliki ketergantungan dalam proyek Anda yang memberi isyarat menggunakan 4.2 tetapi Anda memaksanya untuk menggunakan 4.0. Jika menggunakan salah satu properti baru atau metode yang diperkenalkan pasca 4.0 Anda akan mendapatkan kegagalan runtime pada waktu yang sulit untuk memprediksi.
David Burg

Tautan ke utas github sudah mati. Tetapi utas berikut tampaknya berisi diskusi yang relevan: github.com/dotnet/runtime/issues/24382
Hermann.Gruber

5

Saya baru saja menginstal System.Net.Httpmenggunakan NuGet. Anda dapat mengambilnya di sini:

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

The ASP.NET MVCproyek yang saya kerjakan target .NET 4.6.1. Ini berfungsi dengan sempurna di mesin saya saat men-debug IIS Expressdengan Visual Studio 2019.

Masalah terjadi saat mencoba menjalankan aplikasi yang disebarkan ke Azure. Saya mendapatkan kesalahan ini:

Tidak dapat memuat file atau assembly 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' atau salah satu dependensinya.

Apa yang benar-benar berfungsi dalam kasus saya adalah membuka file .csproj dan mencari System.Net.Httpseperti di tangkapan layar berikut ...

masukkan deskripsi gambar di sini

Lihat bahwa .csprojfile tersebut memiliki versi 4.1.1.3:

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

The <HintPath>benar-benar menunjuk ke ..\packagesfolder dari Nuget, yaitu, ini adalah versi nyata diinstal oleh Nuget. Setelah diterapkan, versi khusus ini juga akan dipulihkan di sisi server dan semuanya harus bekerja dengan pengalihan bind.

... dan pengalihan pengikatan harus menyebutkan versi khusus Web.configini seperti ini:

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

Ini memperbaiki masalah dalam kasus saya setelah beberapa komitmen pada Azure Kudu . Situs web Azure akhirnya dimulai tanpa kesalahan.


4

Apa yang saya lakukan untuk memperbaiki masalah ini telah menghapus semua binding dari web.config dan melakukan

Update-Package -reinstall

Ini menghilangkan banyak binding lama yang mungkin tidak perlu ada di sana dan benar-benar melakukan pembersihan yang baik.


2

Saya mengalami kesalahan ini saat menerapkan layanan web ke salah satu server kami. Proyek menargetkan .Net framework 4.7.2, yang tidak diinstal di server. Menginstal kerangka 4.7.2 di server memperbaiki masalah.


Ini juga masalah saya. Ini adalah topik yang berulang untuk versi lain juga.
Jason Geiger

2

Jawaban Andrei U mengarah pada keselamatan saya. Namun, alasannya tidak sesuai dengan kasus saya. Untuk orang-orang yang berada dalam skenario yang sama dengan saya:

Ini adalah kesalahan waktu proses (bukan waktu pembuatan), saat pembuatan berhasil, tetapi akan berfungsi di satu komputer, tetapi tidak pada server. Solusi: - Menambahkan paket System.Net.Http. - Ubah nama file: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.7.2 \ System.Net.Http.dll (misalnya, ganti nama menjadi: System.Net.Http.dll.BAK) di membangun server.

Saya tidak memiliki dan masih tidak memiliki pengalihan perakitan untuk dll ini


1

Satu solusi sederhana yang saya temukan adalah menurunkan kerangka kerja target untuk proyek web ke 4.6.

Saya membuat klien dan aplikasi web, klien memiliki .net framework 4.7.1 dan web memiliki hal yang sama dan saya menghadapi masalah yang sama, ketika saya menurunkan target .net framework untuk web itu berfungsi untuk saya.


1

Setelah berjuang dengan ini selama beberapa hari, saya akhirnya mendapatkan masalah .Net 4.7.2 / System.Net.Http diperbaiki untuk proyek saya. Selain mengubah file * .csproj untuk menargetkan versi kerangka kerja 4.7.2, saya juga harus memperbarui app.config dalam proyek dari

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

untuk:

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

0

Saya memiliki masalah yang sama. Pada akhirnya saya menyelesaikannya dengan mengubah Deploy-FabricApplication.ps1 menjadi seperti ini

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

Saya menemukan System.Net.Http.dll 4.2.0.0 yaitu x64. Sebelum menerapkan skrip ini, salin dll ke direktori paket dan ubah file konfigurasi untuk menggunakan file ini secara eksplisit. Saya juga menulis blog tentang masalah System.Net.Http saya di http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-problems.html

Jangan lupa untuk mengganti [ProjectName] dengan nama proyek Anda sendiri

Semoga ini bisa membantu, jangan ragu untuk bertanya


0

Bagi saya adalah sesuatu yang sangat aneh. Diperlukan berjam-jam debugging setelah menemukan apa masalahnya. Itu tidak terjadi secara lokal tetapi hanya ketika menggunakan jenkins untuk membangun proyek.

Saya memiliki perpustakaan kecil menggunakan dotnet standart 2.0 dan proyek utamanya adalah proyek WCF yang didasarkan pada .NET normal (milik saya secara khusus v4.6.1). Tetapi di kelas startup pustaka standart dotnet saya memiliki beberapa kode yang terlihat seperti ini:

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

Antarmuka IStaticDataConfiguration terlihat seperti di bawah ini:

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

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

Antarmuka ini berada di dalam pustaka standar dotnet sementara implementasinya berada di luarnya (terletak di proyek WCF).

Dari luar perpustakaan saya memanggil AddStaticDataConfigurationmetode seperti di bawah ini:

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

Masalahnya adalah bahwa saya meneruskan Func<HttpClient>dari proyek .NET normal ke perpustakaan standar dotnet yang untuk beberapa alasan gila standart dotnet tidak suka dan mungkin dianggap HttpClientberasal dari kelas yang berbeda, sebagai akibatnya membuang System.Net.Http 4.x.x.xpengecualian yang tidak ditemukan. Ketika menghapus kode untuk tidak menerima HttpClientdari proyek .NET normal tetapi membuat yang baru funcdi dalam perpustakaan itu sendiri senang dan berfungsi dengan baik. Semoga ini bisa membantu orang lain karena kesalahan ini terjadi karena banyak alasan :)


0

Solusi saya mirip dengan @ Raquib. Proyek saya adalah 4.7.2 dan bekerja dengan baik di PC saya. Setiap kali saya menerapkan ke server dev kami, saya akan mendapatkan masalah yang disebutkan dalam pertanyaan. Ternyata versi .net tertinggi di server adalah 4.6.1. Menurunkan proyek saya ke 4.6.1 memperbaiki masalah. Meningkatkan versi .net server bukanlah pilihan bagi saya.


0

Saya yakin sebagian dari jawabannya dapat ditemukan di dokumentasi Microsoft .

Ketika Anda membuat aplikasi desktop di Visual Studio yang menargetkan .NETFramework 4.5.1 atau versi yang lebih baru, aplikasi menggunakan pengalihan pengikatan otomatis.

Seperti yang ditunjukkan oleh jawaban @Vivek Sharma, menghapus:

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

menyelesaikan masalah dalam 3 kasus seperti itu di aplikasi saya. Saat Anda memeriksa DLL dengan Powershell, misalnya:

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

Keluaran

System.Net.Sockets, Versi = 4.0.0.0

Jelas pengalihan mengikat ke 4.2.0.0 tidak akan berfungsi karena kami mengeluarkannya 4.0.0.0ke bin.

Anda juga perlu memeriksa GAC ​​untuk melihat apakah rakitan juga hilang dari sana:

 gacutil -l System.Net.Sockets

Dalam kasus saya, versi tertentu juga hilang dari GAC. Jika DLL berada di GAC maka itu seharusnya ditemukan dalam proses pengikatan perakitan .


-2

Hapus dulu dari sistem file lokal Anda:

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

Kemudian hapus semua referensi di Proyek dan, tambahkan referensi 4.0.
Ini memecahkan masalah saya.


3
oh tidak, mohon jangan merusak instalasi VS anda dengan menghapus beberapa file nya.
David Burg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.