После обновления 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 и я тоже могу, и в журнале слияния не отображаются подозрительные ошибки привязки.

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

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

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

Установка из обновления

65 голосов | спросил George Mauer 16 +04002014-10-16T18:23:18+04:00312014bEurope/MoscowThu, 16 Oct 2014 18:23:18 +0400 2014, 18:23:18

7 ответов


0

Черт возьми, спасибо @ 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) устраняет проблему.

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

ответил George Mauer 16 +04002014-10-16T19:19:13+04:00312014bEurope/MoscowThu, 16 Oct 2014 19:19:13 +0400 2014, 19:19:13
0

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

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

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

ответил dmatson 17 +04002014-10-17T02:40:54+04:00312014bEurope/MoscowFri, 17 Oct 2014 02:40:54 +0400 2014, 02:40:54
0
  1. Вы можете перейти в Список литературы текущего проекта.
  2. Щелкните правой кнопкой мыши в dll System.Web.Mvc и выберите «Свойства»
  3. Откроется окно свойств
  4. Измените Скопировать локальный на True
ответил TuanDPH 26 FriEurope/Moscow2014-12-26T13:01:45+03:00Europe/Moscow12bEurope/MoscowFri, 26 Dec 2014 13:01:45 +0300 2014, 13:01:45
0

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

ответил usefulBee 11 22014vEurope/Moscow11bEurope/MoscowTue, 11 Nov 2014 00:03:24 +0300 2014, 00:03:24
0

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

Microsoft описывает уязвимость следующим образом:

  

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

ответил Nick Jones 17 +04002014-10-17T00:43:50+04:00312014bEurope/MoscowFri, 17 Oct 2014 00:43:50 +0400 2014, 00:43:50
0

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

Приветствия Microsoft. Ты лучший!

Ваша попытка заставить меня выглядеть некомпетентной перед моими клиентами снова провалилась!

ответил Hemslingo 20 +04002014-10-20T18:13:50+04:00312014bEurope/MoscowMon, 20 Oct 2014 18:13:50 +0400 2014, 18:13:50
0

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

ответил Naro 13 FebruaryEurope/MoscowbFri, 13 Feb 2015 19:15:28 +0300000000pmFri, 13 Feb 2015 19:15:28 +030015 2015, 19:15:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132