Tidak dapat memuat file atau perakitan 'System.Net.Http, Versi = 2.0.0.0 di MVC4 Web API

92

Saya punya sedikit masalah aneh.
Saya mengembangkan aplikasi dengan MVC 4 dan API Web baru dan berfungsi dengan baik secara lokal. Saya menginstal MVC4 di server dan menerapkan aplikasi. Sekarang saya mendapatkan kesalahan berikut:

Tidak dapat memuat file atau rakitan 'System.Net.Http, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' atau salah satu dependensinya. Definisi manifes rakitan terletak tidak cocok dengan referensi rakitan. (Pengecualian dari HRESULT: 0x80131040)

Deskripsi: Pengecualian tidak tertangani terjadi selama eksekusi permintaan web saat ini. Harap tinjau jejak tumpukan untuk informasi lebih lanjut tentang kesalahan dan dari mana asalnya

Cukup lucu, versi System.Net.Http yang saya miliki secara lokal di folder paket saya atau di folder ASP.NET MVC 4 \ Assemblies adalah 1.0.0.0. Saya benar-benar menghapus referensi ke System.Net.Http dari proyek saya, tetapi saya masih mendapatkan pesan yang sama. Saya agak bingung tentang dari mana ia mendapatkan referensi 2.0.0.0 dan mengapa itu akan bekerja secara lokal tetapi tidak di server.

Melihat dependensi nuget:

Pustaka Inti API ASP.NET WEb (Beta) bergantung pada System.Net.Http.Formatting.
Dan System.Net.Http.Formatting tergantung pada System.Net.Http.
Saya rasa dari sanalah ini berasal. Tetapi saya sudah menginstal Versi 2.0.20126.16343 dari paket ini, hanya saja dll di dalamnya memiliki versi 1.0.0.0

Apakah saya melewatkan sesuatu?

MEMPERBARUI:

Ini adalah sub-aplikasi dari aplikasi ASP.NET lain, tetapi yang lainnya masih didasarkan pada WebForms. Jadi, ada sesuatu yang kacau balau. Tetapi jika saya melakukan pembersihan di bawah bagian perakitan di web.config jika tidak menemukan aplikasi itu sendiri lagi.

Remy
sumber
Apakah Anda menggunakan fitur "Tambahkan dependensi yang dapat diterapkan" untuk project ini?
ChristiaanV
Tidak, tidak mencobanya. Tapi saya sudah mengatur semuanya segar dan sekarang berhasil .... Tidak terlalu memuaskan, tapi ...
Remy
Saya mengalami masalah ini setiap kali saya me-restart mesin saya dan meluncurkan kembali studio visual juga. Entah bagaimana itu hilang jika saya melakukan pembersihan dan kemudian membangun kembali solusinya.
frostshoxx

Jawaban:

30

Saya memiliki masalah yang sama dengan penerapan aplikasi saya ke appharbor. Masalah itu belum mendukung .NET 4.5. Apa yang saya lakukan.

  1. Mengalihkan proyek saya ke profil .NET 4.0.
  2. Paket NuGet API Web yang tidak diinstal.
  3. Menginstal paket NuGet Web API (Beta) lagi.
  4. Memverifikasi bahwa file .csproj berisi SEMUA rakitan yang direferensikan, sehingga akan selalu mengambilnya dari folder Bin, bukan GAC.
Alexander Beletsky
sumber
1
Entah bagaimana proyek saya mulai bekerja, tetapi saya tidak tahu mengapa ... Pendekatan Anda tampaknya dapat dilakukan.
Remy
alexanderb - bagaimana cara mengubah ke profil .NET 4.0. Di Visual Studio? Di mana letak folder bin? Apakah file .csproj adalah file web.config? Thx
WhoAmI
114

Saya mengalami kesalahan yang sama saat menyebarkan aplikasi web yang sebelumnya dikonversi (dari .NET 4.5 ke 4.0) di IIS 6.0.

Di bagian runtime web.config yang saya temukan

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

yang telah saya ubah menjadi

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

Sekarang bekerja seperti pesona.

Krzysztof
sumber
4
Haruskah majelis masih diatur untuk menyalin lokal dengan perubahan ini?
Rasmus Christensen
3
Masalah bagi saya adalah salah satu paket Web Api NuGet saya memiliki ketergantungan pada System.Net.Http 2.0.0.0 tetapi referensi saya yang saya miliki adalah 2.1.10.0 yang dikeluarkan ke folder bin saya.
JustinMichaels
2
Ini benar (seperti yang dikatakan Justin Michaels). Ketergantungan mengacu pada 2.0.0.0 tetapi referensi perakitan Anda adalah 2.1.xx Yang perlu Anda perbaiki adalah pengalihan pengikatan.
Tod Thomson
2
Yang ini harus ditandai sebagai jawaban yang benar. Saya rasa itulah sebabnya semua pengguna lain mendorong opsi ini. Terima kasih, Krzysztof!
Blaise
3
Masalahnya mungkin bukan referensi langsung ke System.Net.Http, tetapi referensi tidak langsung yang digunakan di salah satu pustaka lain yang Anda rujuk. Itulah mengapa pengaturan salin lokal umumnya tidak akan memperbaiki masalah ini.
Paul Keister
10

Milik saya bekerja dengan:

Perhatikan pengalihan 1-4 ke 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>
Clive
sumber
Saya melakukan sesuatu seperti ini, tetapi saya memperbarui versi baru ke 4.0.0.0 dan meninggalkan versi lama sebagai 0.0.0.0-2.0.0.0
Veritoanimus
2

Di folder Referensi proyek Anda harus ada referensi ke dll ini, dan versinya harus 2.0.0.0. Pastikan ini disetel ke Salin Lokal = true. Dan kemudian pastikan itu menemukan jalannya ke folder bin aplikasi server Anda.

Ini adalah salah satu perpustakaan yang sekarang dikelola oleh nuget. Jadi buka Nuget dan pastikan semuanya up to date. Dan di direktori paket proyek Anda, file tersebut harus ada di sini: \packages\System.Net.Http.2.0.20126.16343\lib\net40

Anda juga dapat mencoba membuat aplikasi MVC4 baru dan melihat apakah file tersebut muncul untuk aplikasi itu.

GeekyMonkey
sumber
1
Sebenarnya itulah yang membuat saya bingung. Saya menggunakan nuget dan saya memiliki folder ini. Tetapi jika saya melihat System.Net.Http memiliki Versi 1.0.0.0
Remy
1
Ini persis bagaimana saya memperbaikinya! Karena semuanya bekerja secara lokal. Saya baru saja mengklik kanan referensi dan di properti, saya telah menyetel Copy localke true yang menyelesaikannya! lebih mudah / lebih baik daripada bermain-main di file web.config. Cukup tambahkan dll ke folder bin Anda.
JP Hellemons
2

Dalam kasus saya, saya memperbaikinya dengan cara yang jauh lebih mudah, cukup berikan HintPath ke referensi ke paket 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" />
knocte
sumber
1

Dalam kasus saya, saya secara tidak sengaja menambahkan ketergantungan ke System.Net.Http versi 2.1.10.0 melalui NuGet. Saya tidak bisa menyingkirkannya di NuGet Package Manager (karena paket lain sepertinya bergantung padanya). Namun paket tersebut tidak bergantung pada versi khusus ini. Inilah yang saya lakukan untuk menghilangkannya (Anda juga dapat menggunakan konsol NuGet sebagai gantinya (menggunakan parameter –force):

  • Ubah versi Microsoft.Net.Http di packages.config dari 2.1.10.0 menjadi 2.0.0.0
  • Hapus BCL Portability Pack di NuGet Package Manager
  • Hapus secara manual pustaka yang bergantung (System.Net.Http. * Yang memiliki versi 2.1.10.0)
  • Tambahkan referensi ke System.Net.Http 2.0.0.0
Dunken
sumber
1

Dalam file config saya menghapus Majelis dependen:

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

Sekarang berfungsi dengan baik.

StefanoM5
sumber
Untuk menampilkan tag XML dengan benar - format teks Anda sebagai kode. Untuk ini tambahkan saja empat spasi sebelum setiap baris.
Artemix
Tnx Artemix, ini adalah komentar pertama saya;)
StefanoM5
1

Saya menghadapi masalah ini di server uji (Windows 2008 R2) yang seharusnya "siap" untuk penyebaran;)

Petunjuknya adalah ketika saya memeriksa versi System.net antara mesin DEV saya dan server penerapan, mereka tidak cocok.

Diperbaiki menggunakan langkah-langkah di bawah ini:

  1. Mengunduh .NET Framework 4.5 Penginstal mandiri dari SINI

  2. Jalankan pemasang di mesin penerapan

Pasca instalasi kerangka kerja, server ingin reboot, begitu pula dengan volla! Kami siap berangkat !!

Sudhanshu Mishra
sumber
1

Kami menggunakan VS 2013, membuat MVC 4 Web API baru dan memiliki masalah dengan system.net.http.dll yang bukan versi yang benar saat dibuat di server TeamCity kami, tetapi versi ini berfungsi dengan baik di mesin pengembang lokal kami yang memiliki VS 2013 terpasang.

Kami akhirnya menentukan masalahnya.

Saat membuat API Web MVC 4 baru dan memilih kerangka kerja 4.0 pada pembuatan proyek, kami menemukan versi paket NuGet yang benar untuk DLL sedang dimasukkan: .. \ packages \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \ System.Net.Http.dll

Namun file .csproj untuk proyek ini mengatakan jalur untuk file system.net.http.dll ini adalah: .. \ packages \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll

Jadi, ketika build dicoba gagal pada perbedaan jalur ini tetapi menemukan versi kerangka yang benar dari file di tempat lain di mesin pengembang tetapi tidak di server build TeamCity kami.

Sejauh ini, hanya inilah perbedaan yang kami temukan. Mengubah jalur dalam file .csproj dan membangun mesin Dev lokal dengan VS2013 masih berfungsi.

Memeriksa itu ke dalam kontrol versi dan memiliki server build TeamCity kami (tanpa VS 2013 diinstal secara lokal) sekarang menemukan versi yang benar dari .dll di folder paket NuGet untuk solusinya dan berhasil membangun daripada mencari versi lain dari system.net.http .dll dan menemukan versi yang lebih baru yang tidak cocok dengan kerangka kerja sehingga menyebabkan kegagalan pembuatan.

Tidak yakin apakah ini membantu.

Periksa jalur file proyek Anda untuk DLL dan pastikan itu cocok dengan jalur folder paket Anda untuk DLL.

Eric Reiss
sumber
1

Hanya menyederhanakan jawaban lain untuk apa yang berhasil bagi saya.

Saya pergi ke manajer NuGet, menghapus paket terkait (Dalam kasus saya, "Perpustakaan Klien 2.1 Microsoft ASP.NET Web API" dan "Json.NET") dan menginstalnya kembali. Hanya butuh beberapa klik.

Rudy Scoggins
sumber
0

Tutup proyek, Buka lagi. Kemudian, Solusi Bersih + Bangun. Bekerja untuk saya

Lücks
sumber
0

Untuk versi 2.2.15.0, saya melakukan ini:

<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>
Osama
sumber
0

Saya mengalami masalah yang sama persis! Saya melihat tab Peringatan saya di VS dan melihat bahwa salah satu paket nuget saya secara TIDAK LANGSUNG merujuk ke .NETFramework Version 4.5.0.0. Saya harus menghapus paket ini dan kemudian menginstal ulang versi 4.0 tetapi pastikan untuk menentukan versi paket yang mendukung 4.0 (secara default akan kembali ke 4.5 saya percaya jika Anda tidak menentukan saat menginstal paket). Semoga ini membantu!

Javier Gonzalez
sumber
0

Kami mengalami ini terjadi di server setelah penerapan. Itu disebabkan oleh:

A) File lama di folder bin masih berkeliaran yang seharusnya telah dihapus

atau

B) Tidak memiliki akses baca ke folder untuk pengguna Application Pool Identity.

Dengan kata lain, bagi kami ini diselesaikan dengan memperbaiki izin pada folder untuk situs dan menghapus folder bin dan menerapkan ulang.

Chris Moschini
sumber
0

Saya memiliki masalah yang sama dengan Gembox.spreadsheet.dll versi 31.

"Tidak dapat memuat file atau rakitan 'GemBox.Spreadsheet, Version = 39.3.30.1095, Culture = neutral, PublicKeyToken = b1b72c69714d4847' atau salah satu dependensinya. Definisi manifes rakitan yang terletak tidak cocok dengan referensi assembly. (Pengecualian dari HRESULT: 0x80131040 ) "

Saya mencoba hampir semuanya dari artikel ini dan tidak ada yang berhasil. Itu baru saja diperbaiki dengan langkah sederhana.

Saya mencoba membangun proyek individu yang pada dasarnya mengatur referensi versi yang benar untuk dll dan kesalahan itu sepenuhnya hilang dari solusi.

Rachana
sumber
0

Pergi ke masalah serupa dan arahan yang disebutkan dalam banyak komentar berfungsi dengan baik

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

Meskipun, Anda harus memastikan cakupan versi lama cukup tinggi jika tidak, versi yang lebih baru mungkin tidak dialihkan ke versi tertentu yang Anda butuhkan dan lokasi yang menggunakan referensi yang lebih baru tidak akan berfungsi dengan baik karena referensi yang lebih lama sudah ada di direktori bin.

Micaël
sumber
0

Untuk kesalahan ini (dan yang serupa), ada baiknya melalui Konsolidasi NuGet (Solusi> Kelola Paket NuGet ...) untuk memastikan versi komponen referensi yang sama konsisten di setiap pustaka kelas yang dirujuk dalam solusi, karena bahkan versi yang sedikit lebih lama mungkin memiliki ketergantungan pada komponen lama lainnya. Ini mudah digunakan bersama dengan Pembaruan dan dapat menghemat banyak rasa sakit.

Ini memecahkan masalah ini untuk saya dan saya akan mengatakan itu adalah suatu keharusan untuk membiasakan jika Anda membuat perpustakaan pembantu yang juga mereferensikan MVC atau komponen NuGet berbasis web lainnya.

mhapps
sumber