2014-10-16 6 views
65

Я сделал обновление Windows, после чего мое приложение asp.net mvc 5 больше не будет загружать жалобы наПосле обновления Windows «Тип или имя пространства имен« Html »не существует в пространстве имен« System.Web.Mvc »«

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. Почему это когда-нибудь произойдет? Как я могу это исправить?

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

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

Installs from the update

+0

Являются ли ваши рекомендации по проекту ОК? – DavidG

+0

@DavidG да, проект строит просто отлично, и нет неработающих ссылок –

+0

Ваш пул приложений в IIS не настроен на использование .Net Framework 2, если это возможно? – DavidG

ответ

117

Святое дерьмо, благодаря @ Невада-Williford за подсказку. Ввод и установка моей ссылки System.Web.Mvc на <Private>True</Private> (Копировать локально = True) зафиксировали ее. Обратите внимание, что перед обновлением все работало, после обновления мне пришлось изменить свой csproj, чтобы он снова работал.

Рабочей теория о том, что происходит:

Copy Local = True и <Private>True</Private> раньше почти, but not exactly, the same thing. Первые была установка 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's - для большего количества контекста, оговорок и связанных с ними ошибок.

+0

Вид имеет смысл. Похож на (вынужденную) миграцию и часть проекта vNext, где решения полагаются на меньшее количество зависимостей, исходящих из фреймворка. –

+2

О, полностью имеет смысл и меняется к лучшему, но не анонсированное внеполосное обновление, требующее изменений существующего кода? Действительно плохая форма. –

+2

Стоит отметить, что это также нарушает существующие проекты, в которых уже установлен Copy Local = True. По крайней мере, для меня проект больше не копировал сборку локально. Переключение на Copy Local = false, сохранение, а затем возврат к истине и сохранение фиксированного. – xanadont

4

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

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

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

+2

Soooo .... это просто в основном говорит: «Это уязвимость, когда пользователь может атаковать через веб-страницу », правильно? Довольно бесполезное описание. –

32

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

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

  1. Бритва не включает в себя ссылку на MVC по умолчанию, поэтому его компиляция не будет работать, если некоторые версии 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 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 удалит/Private параметр CopyLocal при обновлении пакетов в будущем. (Например, если вы сегодня обновляетесь до MVC 5.2). Если эта версия MVC когда-либо была GAC'd, проблема № 1 выше не будет повторяться до тех пор, пока вы добавили конфигурацию на шаге A выше, но проблема №2 все еще может повториться. Чтобы этого не произошло в будущем, я бы рекомендовал вручную установить CopyLocal обратно в true при каждом обновлении пакета NuGet.

+2

Святая корова, это ужасно. Все, пожалуйста, перейдите на эту ошибку. –

+0

Работал для меня. большое спасибо! – richardwhatever

+0

Настройка 'CopyLocal = true' не помогла нам; см.: ['System.Web.MVC' не копируется в папку' bin' с MS14-059] (http://stackoverflow.com/q/26467078/25124) –

3

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

Cheers Microsoft. Ты лучший!

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

+0

Это будет работать, только если вы * имеете * эту версию mvc, доступную локально или в gac –

+0

CopyLocal = True поместит локальную копию в папку bin и запустит ее. Просто убедитесь, что вы загрузили его в папку bin приложения на тестовом/производственном сервере. – Hemslingo

+0

Позвольте мне исправить вас, ' true' в вашем файле проекта будет принудительно его скопировать. 'Копировать Local = True' будет * иногда * заставить его копировать, потому что эта функция полностью не работает. К сожалению, как отмечали другие люди, несвязанная ошибка nuget удалит параметр ' True', если вы обновите его из nuget, и вам придется вручную его повторно добавить. –

5

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

+0

Что это на самом деле делало с файлом csproj? 'CopyLocal = true' должен быть просто ui для внесения изменений в файл csproj. –

+0

Не уверен, что он сделал с файлом csproj. Также CopyLocal уже был установлен как истина, как сообщалось другим разработчикам. Тем не менее, все, что я знаю, это после закрытия решения или экземпляра Visual Studio и повторного его открытия, ошибка исчезла. – usefulBee

+1

Уборка и восстановление решения работали для меня. Спасибо за предложение –

9
  1. Вы можете перейти к ссылкам на текущий проект.
  2. Щелчок правой кнопкой мыши в библиотеке DLL System.Web.Mvc и выберите Свойства
  3. окно
  4. окно Свойства откроется
  5. Изменить Copy Local в True
+0

Спасибо, что работает, но как он решил, просто не получится! Не могли бы вы дать немного подробного описания того, как это решить? –

1

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

Смежные вопросы

 Смежные вопросы