После обновления Windows "тип или имя пространства имен "Html" не существует в системе пространства имен".Сеть.В MVC'"


Я сделал обновление Windows, а затем мой asp.net приложение mvc 5 больше не будет загружать жалобы на

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

указывая на мои взгляды веб.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 я могу перейти к bound System.Web.Mvc и я могу это также, и журнал слияния не показывает никаких подозрительных ошибок привязки.

это как если бы просто мои представления привязываются (успешно) к старой версии Mvc. Почему это вообще произошло? Как я могу это исправить?

позвольте мне пояснить, что не было никаких изменений конфигурации или даже кода. Это все на моей машине dev на IISExpress. Он был запущен, я сделал обновление и перезагрузился, и теперь он больше не работает.

вот мои последние установки из обновления. Я мог бы начать удалять их один за другим, но я хочу знать, что на самом деле происходит неправильно, как будто я упускаю часть истории.

7 65

7 ответов:

Святое дерьмо, спасибо @Nevada-Williford за подсказку. Зайдя и установив мой System.Web.Mvc ссылка <Private>True</Private> (Copy Local = 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 Local показывает False и вы должны установить его в True сделать конечно, вы получите локальную копию.

настройки вручную Copy Local = True (или добавление этого xml-элемента в msbuild) устраняет проблему.

Edit: хотя это, по - видимому, ответ на конкретный вопрос, Любой, кто приходит сюда, должен прочитать поток комментариев и другие ответы - особенно dmatson-для большего контекста, предостережений и связанных с ними ошибок.

это было сломано для любых пользователей без CopyLocal=true (или, в MSBuild говорят,<Private>True</Private>) by MS14-059. Шаблоны MVC устанавливают <Private>True</Private> по умолчанию, но если вы используете NuGet для обновления версии MVC, вы потеряете настройки (см. ошибка NuGet #4344).

есть два аспекта проблемы:

  1. Razor не включает ссылку на MVC по умолчанию, поэтому его компиляция не будет работать, если в вашем Бине не существует какой-либо версии библиотеки DLL MVC папка.
  2. если вы развертываете на отдельной машине, на которой не установлено это обновление, DLL MVC больше не включается в ваш вывод, поэтому 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. Set CopyLocal=true В vs UI для проекта ссылка, или вручную добавить следующую строку ниже в Reference в свой .файл csproj:

    <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'D, проблема № 1 выше не будет повторяться до тех пор, пока вы добавили конфигурацию в шаге А выше, но проблема № 2 все еще может повториться. Чтобы убедиться, что это не произойдет в будущем, я бы рекомендовал вручную установить CopyLocal обратно в true каждый раз, когда вы делаете обновление пакета NuGet.

  1. вы можете перейти к ссылкам текущего проекта.
  2. щелкните правой кнопкой мыши в dll System.Web.Mvc и выберите Свойства
  3. откроется окно свойств
  4. изменить Копировать Локально до True

установка CopyLocal=true не помогла. Очистка раствора, затем закрытие его и повторное открытие снова работали. Возможно, Вам также потребуется закрыть весь экземпляр Visual Studio.

похоже, это было вызвано обновлением Windows ( KB2990942) чтобы исправить уязвимость системы безопасности MS14-059, что позволяет обойти функцию безопасности. Наши сборки перестали работать на нашем сервере сборки после установки Центра Обновления Windows и обновления файлов csproj для использования 4.0.0.1 для системы.Сеть.MVC ссылка Исправлена проблема.

описание уязвимости от Microsoft:

уязвимость может позволить безопасность функция обхода, если злоумышленник убеждает пользователя щелкнуть специально созданную ссылку или посетить веб-страницу, содержащую специально созданное содержимое, предназначенное для использования уязвимости. В случае атаки через интернет злоумышленник может создать специальный веб-сайт, предназначенный для использования данной уязвимости через браузер, а затем убедить пользователя посетить веб-сайт. Злоумышленник также может воспользоваться скомпрометированными веб-сайтами и веб-сайтами, которые принимают или размещают пользовательский контент или реклама. Эти веб-сайты могут иметь специальное содержимое, использующее данную уязвимость. Однако во всех случаях злоумышленник не сможет заставить пользователей просматривать содержимое, контролируемое злоумышленником. Вместо этого злоумышленник должен будет убедить пользователей принять меры, как правило, заставляя их щелкнуть ссылку в сообщении электронной почты или в сообщении мгновенного обмена сообщениями, которое приведет их на веб-сайт злоумышленника, или заставить их открыть вложение, отправленное через электронная почта.

а также установка CopyLocal=true в ссылке на проект вам также может потребоваться изменить веб.Конфигурационный файл вот так...

  <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 framework на любых тестовых / производственных серверах.

Ура Microsoft. Ты самый лучший!

как CopyLocal=true в ссылке на проект вам также может потребоваться изменить Web.Конфигурации файл вот так...

<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" также, и все это решило проблему.