web-dev-qa-db-ja.com

Windows更新後「タイプまたは名前空間名「Html」は名前空間「System.Web.Mvc」に存在しません」

Windowsの更新を行った後、asp.net mvc 5アプリケーションがロードされなくなりました

CS0234: The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc'

ビューweb.configに障害があることを示す

  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Ogre.Extensions" />
        <add namespace="Newtonsoft.Json"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

今、これは非常に混乱しています。私のプロジェクト自体には、Html名前空間があり、ILSpyでアセンブリを開いて、バインドされたSystem.Web.Mvcと私も同様にできます。また、フュージョンログには疑わしいバインディングエラーは表示されません。

just私のビューが古いバージョンのMvcに(正常に)バインドされているかのようです。なぜそれが起こるのでしょうか?どうすれば修正できますか?

構成やコードの変更さえなかったことをはっきりさせてください。これはすべて、IISExpressの開発マシン上にあります。実行中だったので、更新して再起動しましたが、現在は実行されていません。

更新からの最近のインストールを以下に示します。それらを1つずつ削除し始めることもできますが、ストーリーの一部が欠落しているように感じられるため、実際に何が間違っているのかを知りたいです。

Installs from the update

66
George Mauer

@ Nevada-Willifordのヒントに感謝します。 System.Web.Mvcへの参照を設定して<Private>True</Private>への参照を設定(ローカルにコピー= True)すると修正されました。更新前にすべてが機能していたことに注意してください。更新後、csprojを修正して再度動作させる必要がありました。

何が起こっているのかについての理論:

Copy Local = Trueおよび<Private>True</Private>は、以前はほとんど ただし正確には同じではありません 前者はVisual Studio設定で、後者はmsbuild設定でした。 msbuild設定が存在しない場合、Visual Studioの設定が適用されます(VSにいる限り)。この更新では、Copy Localが単にプレゼンス属性を反映するように変更したと思います。

私たちのプロジェクトでは、その属性は明示的に設定されていませんが、Copy Local = Trueなので、更新の前にSystem.Web.Mvc.dllがbinディレクトリにコピーされます。更新後、属性が欠落しているためCopy LocalFalseを示し、ローカルコピーを取得するためにTrueに設定する必要があります。

Copy Local = Trueを手動で設定する(またはmsbuildにそのxml要素を追加する)と問題が修正されます。

編集:これは特定の質問に対する答えのように見えますが、ここに来る人はコメントスレッドと他の答え、特にdmatsonの記事を読んでください。 、警告、および関連するバグ。

117
George Mauer

これはCopyLocal=true(またはMSBuildでは<Private>True</Private>)を持たないすべてのユーザーに対して MS14-059 で壊れていました。 MVCテンプレートはデフォルトで<Private>True</Private>を設定しますが、NuGetを使用してMVCバージョンを更新すると、その設定は失われます( NuGetバグ#4344 を参照)。

問題には2つの側面があります。

  1. RazorにはデフォルトでMVCへの参照が含まれていないため、binフォルダーにMVC DLLの何らかのバージョンが存在しない限り、コンパイルは機能しません。
  2. この更新プログラムがインストールされていない別のマシンにデプロイすると、MVC DLLは出力に含まれなくなり、MVCは失われます。

問題#1が発生しています。両方の問題を解決するには、次の両方の変更を行うことをお勧めします。

  1. Views\Web.configに次の構成を追加します。

    <system.web>
      <compilation>
        <assemblies>
          <add Assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </assemblies>
      </compilation>
    </system.web>
    
  2. プロジェクト参照のVS UIでCopyLocal=trueを設定するか、.csprojファイルのReferenceに次の行を手動で追加します。

    <Private>True</Private>
    

したがって、完全な参照は次のようになります。

<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>..\..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>

今後パッケージを再度更新すると、NuGetはCopyLocal/Private設定を削除することに注意してください。 (たとえば、今日MVC 5.2に更新する場合)。そのバージョンのMVCがGACされた場合、上記の手順Aで構成を追加した限り、上記の問題#1は再発しませんが、問題#2が再び発生する可能性があります。今後これが起こらないようにするために、NuGetパッケージの更新を行うたびにCopyLocalを手動でtrueに戻すことをお勧めします。

32
dmatson
  1. 現在のプロジェクトの参照に移動できます。
  2. Dllを右クリックSystem.Web.Mvcおよび[プロパティ]を選択します
  3. プロパティウィンドウが開きます
  4. ローカルコピーTrueに変更します
9
TuanDPH

CopyLocal = trueの設定は役に立ちませんでした。ソリューションをクリーニングしてから閉じて、再度開くとうまくいきました。 Visual Studioインスタンス全体も閉じる必要があります。

5
usefulBee

これは、Windows Update( KB2990942 )がセキュリティ脆弱性 MS14-059 を修正し、セキュリティ機能のバイパスを許可したために発生したようです。 Windows Updateのインストール後、ビルドサーバーでビルドが機能しなくなり、System.Web.Mvc参照に4.0.0.1を使用するようにcsprojファイルを更新すると、問題が修正されました。

この脆弱性に関するマイクロソフトの説明は次のとおりです。

この脆弱性により、攻撃者がユーザーに特別に細工されたリンクをクリックするか、脆弱性を悪用するように設計された特別に細工されたコンテンツを含むWebページにアクセスするよう誘導する場合、セキュリティ機能がバイパスされる可能性があります。 Webベースの攻撃シナリオでは、攻撃者は、Webブラウザーを介して脆弱性を悪用するように設計された特別に細工されたWebサイトをホストし、ユーザーにそのWebサイトを表示させる可能性があります。攻撃者は、侵害されたWebサイトや、ユーザーが提供したコンテンツまたは広告を受け入れるまたはホストするWebサイトを利用する可能性もあります。これらのWebサイトには、この脆弱性を悪用する可能性のある特別に細工されたコンテンツが含まれている可能性があります。ただし、すべての場合において、攻撃者はユーザーに攻撃者が制御するコンテンツを強制的に表示させることはできません。代わりに、攻撃者は通常、ユーザーに攻撃者のWebサイトに移動する電子メールメッセージまたはインスタントメッセンジャーメッセージのリンクをクリックさせるか、電子メールで送信された添付ファイルを開かせることにより、ユーザーにアクションを実行させる必要があります。 。

4
Nick Jones

プロジェクト参照でCopyLocal = trueを設定するだけでなく、Web.Configファイルも次のように変更する必要があります。

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
  </dependentAssembly>

NewVersion = "4.0.0.1"に注意してください。これは私のために働いたし、それがいくつかの人々にも役立つことを願っています。

テスト/実稼働サーバー上のMVCフレームワークの更新を保存します。

マイクロソフトに乾杯。あなたは最高です!

私のクライアントの前で私を無能に見せようとするあなたの試みはまたもや失敗しました!

3
Hemslingo

CopyLocal=trueプロジェクト参照では、Web.Configファイルを次のように変更する必要がある場合があります。

<dependentAssembly>
  <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>

追加した culture="neutral"また、これで問題は解決しました。

1
Naro