MVC4 Web APIでファイルまたはアセンブリ 'System.Net.Http、Version = 2.0.0.0を読み込めませんでした


92

ちょっと変な問題があります。
MVC 4と新しいWeb APIを使用してアプリを開発したところ、ローカルで正常に動作しました。サーバーにMVC4をインストールしてアプリをデプロイしました。今、私は次のエラーを受け取ります:

ファイルまたはアセンブリ 'System.Net.Http、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULTからの例外:0x80131040)

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとエラーの発生場所の詳細については、スタックトレースを確認してください

おかしなことに、パッケージフォルダーまたはASP.NET MVC 4 \ AssembliesフォルダーにローカルにあるSystem.Net.Httpのバージョンは1.0.0.0です。実際にSystem.Net.Httpへの参照をプロジェクトから削除しましたが、それでも同じメッセージが表示されます。2.0.0.0参照がどこから取得されるのか、それがローカルでは機能するがサーバーでは機能しない理由について少し混乱しています。

nugetの依存関係を見る:

ASP.NET WEb APIコアライブラリ(ベータ版)は、System.Net.Http.Formattingに依存しています。
また、System.Net.Http.FormattingはSystem.Net.Httpに依存しています。
これが原因だと思います。しかし、私はこのパッケージのバージョン2.0.20126.16343をインストールしていますが、内部のdllのバージョンが1.0.0.0であるというだけです。

何か不足していますか?

更新:

これは別のASP.NETアプリのサブアプリケーションですが、もう1つはまだWebFormsに基づいています。だから、何かがめちゃくちゃになっています。しかし、web.configのアセンブリセクションの下でクリーンアップを実行すると、アプリ自体が見つからない場合でも、


このプロジェクトで「デプロイ可能な依存関係の追加」機能を使用しましたか?
ChristiaanV

いいえ、試しませんでした。しかし、私はすべてを新鮮に設定しましたが、今は機能します。...本当に満足できるわけではありませんが...
レミー

マシンを再起動し、ビジュアルスタジオも再起動するたびに、この問題が発生します。どういうわけか私がきれいにしてからソリューションを再構築するとそれは消えました。
frostshoxx 2016年

回答:


30

アプリをappharborにデプロイするときにも同じ問題が発生しました。.NET 4.5をまだサポートしていない問題。私がしたこと。

  1. プロジェクトを.NET 4.0プロファイルに切り替えました。
  2. Web API NuGetパッケージをアンインストールしました。
  3. Web API(ベータ)NuGetパッケージを再インストール。
  4. .csprojファイルに参照されるすべてのアセンブリが含まれていることを確認したため、GACではなく常にBinフォルダーから取得します。

1
どういうわけか私のプロジェクトは機能し始めましたが、なぜ私には手掛かりがありません...あなたのアプローチは実現可能のようです。
レミー

alexanderb-.NET 4.0プロファイルに変更する方法 Visual Studioでは?binフォルダーはどこにありますか?.csprojファイルはweb.configファイルですか?Thx
WhoAmI

114

以前に変換された(.NET 4.5から4.0に)WebアプリをIIS 6.0にデプロイするときにも同じエラーが発生しました。

私が見つけたweb.config ランタイムセクションで

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

私が変更しました

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

今魅力のように動作します。


4
この変更により、アセンブリをローカルにコピーするように設定する必要がありますか?
Rasmus Christensen

3
私の問題は、Web Api NuGetパッケージの1つがSystem.Net.Http 2.0.0.0への依存関係を保持していたことですが、私の参照は、binフォルダーに出力されている2.1.10.0でした。
JustinMichaels 2013年

2
これは正しいです(ジャスティンマイケルズが言ったように)。依存関係は2.0.0.0を参照していますが、アセンブリ参照は2.1.xxを参照しています。これを修正するために必要なのはバインディングリダイレクトだけです。
Tod Thomson

2
これは正解としてマークする必要があります。他のすべてのユーザーがこのオプションを押し上げているのはそのためだと思います。ありがとう、クシシュトフ!
ブレーズ2013

3
問題はおそらくSystem.Net.Httpへの直接参照ではなく、参照している他のライブラリの1つで使用されている間接参照です。そのため、通常、コピーをローカルに設定してもこの問題は解決しません。
ポール

10

私と一緒に働いた:

1-4から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>

私はこのようなことをしましたが、newVersionを4.0.0.0に更新し、oldVersionを0.0.0.0-2.0.0.0のままにしました
Veritoanimus

2

プロジェクトのReferencesフォルダーには、このdllへの参照があり、バージョンは2.0.0.0である必要があります。これがCopy Local = trueに設定されていることを確認してください。そして、それがサーバーアプリのbinフォルダーに到達することを確認します。

これは、現在nugetで管理されているライブラリの1つです。Nugetを開いて、すべてが最新であることを確認してください。そしてあなたのプロジェクトパッケージディレクトリではファイルはここにあるはずです: \packages\System.Net.Http.2.0.20126.16343\lib\net40

また、新しいMVC4アプリを作成して、そのアプリでファイルが表示されるかどうかを確認することもできます。


1
実際、それが私を混乱させています。私はnugetを使用しており、このフォルダーがあります。しかし、System.Net.Httpを見ると、バージョン1.0.0.0
レミー

1
これはまさに私がそれを修正した方法です!それはすべてローカルで動作したため。私は参照を右クリックし、プロパティで、それを解決Copy localするtrueに設定しました!簡単/良いし、web.configファイルをいじくります。dllをbinフォルダーに追加するだけです。
JP Hellemons 2013年

2

私の場合は、はるかに簡単な方法で修正しました。nugetパッケージへの参照にHintPathを指定するだけです。

     <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

私の場合、NuGetを介してSystem.Net.Httpバージョン2.1.10.0に依存関係を誤って追加しました。NuGetパッケージマネージャーでそれを取り除くことができませんでした(他のパッケージがそれに依存しているようだったため)。ただし、これらのパッケージはこの特定のバージョンに依存していません。これを取り除くために私がしたことは次のとおりです(代わりに(–forceパラメーターを使用して)NuGetコンソールを使用することもできます)。

  • packages.configのMicrosoft.Net.Httpのバージョンを2.1.10.0から2.0.0.0に変更します
  • NuGet Package ManagerでBCL Portability Packをアンインストールする
  • 依存ライブラリ(バージョン2.1.10.0のSystem.Net.Http。*)を手動で削除します
  • System.Net.Http 2.0.0.0への参照を追加します。

1

ファイル構成で、依存アセンブリを削除しました:

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

今ではうまくいきます。


XMLタグを適切に表示するには、テキストをコードとしてフォーマットします。これには、各行の前に4つのスペースを追加するだけです。
Artemix 2013

Tnx Artemix、これは私の最初のコメントです;)
StefanoM5 2013

1

展開の準備ができていると思われるテストサーバー(Windows 2008 R2)でこの問題に直面していました;)

ヒントは、私のDEVマシンとデプロイメントサーバーの間でSystem.netのバージョンをチェックしたときに、バージョンが一致しなかったことです。

以下の手順を使用して修正:

  1. ここから.NET Framework 4.5スタンドアロンインストーラーをダウンロード

  2. 導入マシンでインストーラーを実行した

フレームワークのインストール後、サーバーは再起動を望んでいたので、再起動しました。よろしくお願いします!!


1

私たちはVS 2013を使用しており、新しいMVC 4 Web APIを作成しました。TeamCityサーバーでビルドすると、system.net.http.dllが正しいバージョンではないという問題がありましたが、VS 2013がインストールされているローカルの開発用マシンで問題なくビルドされますインストールされています。

最終的に問題を特定しました。

新しいMVC 4 Web APIを作成し、プロジェクトの作成時にフレームワーク4.0を選択すると、DLLの正しいNuGetパッケージバージョンが.. \ packages \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \に置かれていることがわかりました。 System.Net.Http.dll

ただし、このプロジェクトの.csprojファイルでは、このsystem.net.http.dllファイルのパスは次のとおりです:.. \ packages \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll

したがって、ビルドが試行されると、このパスの違いで失敗しますが、TeamCityビルドサーバーではなく、開発者のマシン上の別の場所でファイルの正しいフレームワークバージョンを見つけています。

これまでのところ、これが唯一の違いです。.csprojファイルのパスを変更し、VS2013を使用してローカルのDevマシンでビルドすることは、まだ機能します。

これをバージョン管理にチェックインし、TeamCityビルドサーバー(VS 2013がローカルにインストールされていない)を使用すると、ソリューションの正しいバージョンの.dllがNuGetパッケージフォルダーで見つかり、system.net.httpの別のバージョンを検索するのではなく、正常にビルドされます。 .dllとフレームワークに一致しない新しいバージョンを見つけると、ビルドが失敗します。

これが役立つかどうかはわかりません。

DLLのプロジェクトファイルパスを確認し、DLLのパッケージフォルダーパスと一致していることを確認してください。


1

私のために働いたものの他の答えを単純化するだけです。

私はNuGetマネージャーに行き、関連パッケージ(私の場合、「Microsoft ASP.NET Web API 2.1クライアントライブラリ」と「Json.NET」)をアンインストールして再インストールしました。数回クリックするだけです。


0

プロジェクトを閉じて、もう一度開きます。次に、Clean Solution + Build。私のために働く


0

バージョン2.2.15.0の場合、これを行いました:

<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

私はこれとまったく同じ問題を抱えていました!VSの[警告]タブを確認したところ、nugetパッケージの1つが.NETFrameworkバージョン4.5.0.0を間接的に参照していることがわかりました。このパッケージをアンインストールしてから4.0バージョンを再インストールする必要がありましたが、4.0をサポートするパッケージバージョンを必ず指定してください(パッケージのインストール時に指定しないと、デフォルトで4.5に戻ります)。お役に立てれば!


0

これは、展開後にサーバーで発生しました。次のいずれかが原因です。

A)まだ残っているbinフォルダー内の古いファイルは削除されているはずです

または

B)アプリケーションプールIDユーザーのフォルダーへの読み取りアクセス権がない。

つまり、サイトのフォルダーのアクセス許可を修正し、binフォルダーを一掃して再展開することで、これは解決されました。


0

Gembox.spreadsheet.dllバージョン31でも同じ問題が発生しました。

"ファイルまたはアセンブリ 'GemBox.Spreadsheet、Version = 39.3.30.1095、Culture = neutral、PublicKeyToken = b1b72c69714d4847'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULTからの例外:0x80131040 ) "

私はこれらの記事のほとんどすべてを試しましたが、どれもうまくいきませんでした。簡単なステップで修正されました。

基本的にdllへの正しいバージョン参照を設定する個々のプロジェクトを構築してみましたが、エラーは完全に解決されました。


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>

ただし、古いバージョンのカバレッジが十分に高いことを確認する必要があります。そうしないと、新しいバージョンが必要な特定のバージョンにリダイレクトされず、古い参照がすでにbinディレクトリにあるため、その新しい参照を使用する場所は正しく機能しません。


0

このエラー(および同様の)については、NuGet Consolidate(ソリューション> NuGetパッケージの管理...)を実行して、ソリューションで参照されている各クラスライブラリで同じ参照コンポーネントバージョンが一貫していることを確認してください。少し古いバージョンでも依存関係がある可能性があるためです。他の古いコンポーネント。アップデートと組み合わせて使用​​するのは簡単で、多くの苦痛を軽減できます。

これでこの問題は解決しました。MVCまたは他のWebベースのNuGetコンポーネントも参照するヘルパーライブラリを作成している場合は、これに慣れる必要があると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.