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, Nullable1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable
1 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
Jawaban:
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 terbaruSystem.Net.Http
4.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:
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 banyakGalat 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
.csproj
bukan dalampackages.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-referencesumber
Menghapus pengalihan binding berhasil untuk saya, Anda dapat mencoba menghapusnya:
sumber
dependentAssembly
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.
Ketika saya mulai melihat rakitan, saya dapat melihat bahwa proyek web dan proyek layanan saya menargetkan versi yang berbeda
System.Net.Http
.Proyek web:
Proyek layanan:
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:
Jalur layanan:
Sesuatu yang sederhana seperti pengaturan
Copy Local
untuktrue
dapat memperbaiki masalah, namun tidak dalam semua kasus.Untuk mereproduksi kesalahan di komputer lokal Anda, cukup hapus yang diperlukan
System.Net.Http.dll
dari 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.Http
melaluiNuGet
periksa perakitan mana yang digunakan dengan melihat.csproj
versi.System.Net.Http 4.3.4
memberikan perakitan berikut misalnya:Jika Anda menggunakan server build seperti Jenkins, TeamCity, atau AppVeyor, runtime yang hilang
.dll
mungkin juga ada di sana. Dalam hal ini mungkin tidak membantu untuk menggunakan versi NuGet dari System.Net.Http atau menghapus yang hilang.dll
secara lokal. Untuk mengatasi kesalahan ini, lihat versi yang tidak ditemukan dan spesifikPublicKeyToken
. Setelah itu buat pengalihan binding di salah satuWeb.config
atauApp.config
bergantung pada project Anda. Dalam kasus saya, saya ingin menggunakan 4.0.0.0 sebagai gantinya:Utas Github yang bagus tentang masalah ini:
https://github.com/dotnet/corefx/issues/22781
sumber
Saya baru saja menginstal
System.Net.Http
menggunakan NuGet. Anda dapat mengambilnya di sini:https://www.nuget.org/packages/System.Net.Http/
The
ASP.NET MVC
proyek yang saya kerjakan target.NET 4.6.1
. Ini berfungsi dengan sempurna di mesin saya saat men-debugIIS Express
dengan Visual Studio 2019.Masalah terjadi saat mencoba menjalankan aplikasi yang disebarkan ke Azure. Saya mendapatkan kesalahan ini:
Apa yang benar-benar berfungsi dalam kasus saya adalah membuka file .csproj dan mencari
System.Net.Http
seperti di tangkapan layar berikut ...Lihat bahwa
.csproj
file tersebut memiliki versi4.1.1.3
:The
<HintPath>
benar-benar menunjuk ke..\packages
folder 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.config
ini seperti ini:Ini memperbaiki masalah dalam kasus saya setelah beberapa komitmen pada Azure Kudu . Situs web Azure akhirnya dimulai tanpa kesalahan.
sumber
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.
sumber
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.
sumber
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
sumber
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.
sumber
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
untuk:
sumber
Saya memiliki masalah yang sama. Pada akhirnya saya menyelesaikannya dengan mengubah Deploy-FabricApplication.ps1 menjadi seperti ini
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
sumber
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:
Antarmuka IStaticDataConfiguration terlihat seperti di bawah ini:
Antarmuka ini berada di dalam pustaka standar dotnet sementara implementasinya berada di luarnya (terletak di proyek WCF).
Dari luar perpustakaan saya memanggil
AddStaticDataConfiguration
metode seperti di bawah ini: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 dianggapHttpClient
berasal dari kelas yang berbeda, sebagai akibatnya membuangSystem.Net.Http 4.x.x.x
pengecualian yang tidak ditemukan. Ketika menghapus kode untuk tidak menerimaHttpClient
dari proyek .NET normal tetapi membuat yang barufunc
di dalam perpustakaan itu sendiri senang dan berfungsi dengan baik. Semoga ini bisa membantu orang lain karena kesalahan ini terjadi karena banyak alasan :)sumber
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.
sumber
Saya yakin sebagian dari jawabannya dapat ditemukan di dokumentasi Microsoft .
Seperti yang ditunjukkan oleh jawaban @Vivek Sharma, menghapus:
menyelesaikan masalah dalam 3 kasus seperti itu di aplikasi saya. Saat Anda memeriksa DLL dengan Powershell, misalnya:
Keluaran
Jelas pengalihan mengikat ke
4.2.0.0
tidak akan berfungsi karena kami mengeluarkannya4.0.0.0
ke bin.Anda juga perlu memeriksa GAC untuk melihat apakah rakitan juga hilang dari sana:
Dalam kasus saya, versi tertentu juga hilang dari GAC. Jika DLL berada di GAC maka itu seharusnya ditemukan dalam proses pengikatan perakitan .
sumber
Hapus dulu dari sistem file lokal Anda:
Kemudian hapus semua referensi di Proyek dan, tambahkan referensi 4.0.
Ini memecahkan masalah saya.
sumber