Перенос моего приложения MVC 3 на MVC 4

#asp.net-mvc-3 #migration #razor

#asp.net-mvc-3 #миграция #razor

Вопрос:

Я действительно не знаю, что делать, я следую этой статье, в которой показано, как перенести мое приложение MVC 3 вручную .

Я выполнил все шаги, но при запуске моего приложения возникает следующая ошибка:

Ошибка сервера в приложении ‘/’.

Не удалось загрузить файл или сборку ‘System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

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

Сведения об исключении: System.IO.FileLoadException: не удалось загрузить файл или сборку ‘System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Ошибка источника:

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

Трассировка загрузки сборки: следующая информация может быть полезной, чтобы определить, почему не удалось загрузить сборку ‘System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35’.

WRN: ведение журнала привязки сборки отключено. Чтобы включить ведение журнала сбоев привязки сборки, установите значение реестра [HKLM Software Microsoft Fusion!Включить журнал] (DWORD) на 1. Примечание: существует некоторое снижение производительности, связанное с протоколированием сбоев привязки сборки. Чтобы отключить эту функцию, удалите значение реестра [HKLM Software Microsoft Fusion!Включить журнал].

Трассировка стека:

[FileLoadException: не удалось загрузить файл или сборку ‘System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)]
Microsoft.Web.Samples.Предварительный код запуска приложения.Start() 0

[Исключение InvalidOperationException: метод инициализации перед запуском приложения запускается при вводе Microsoft.Web.Samples.PreApplicationStartCode выдал исключение со следующим сообщением об ошибке: не удалось загрузить файл или сборку ‘System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040).]
System.Web.Compilation.BuildManager.invokeprestartinitmethod(методы ICollection`1) 423
System.Web.Compilation.BuildManager.вызовprestartinitmethods() 306
System.Web.Hosting.Среда размещения.Инициализировать (ApplicationManager AppManager, IApplicationHost AppHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, исключение appDomainCreationException) 677

[HttpException (0x80004005): метод инициализации перед запуском приложения запускается при вводе Microsoft.Web.Samples.PreApplicationStartCode выдал исключение со следующим сообщением об ошибке: не удалось загрузить файл или сборку ‘System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040).]
System.Web.HttpRuntime.FirstRequestInit(контекст HttpContext) 9079340 System.Web.HttpRuntime.Обеспечьте firststrequestinit(контекст HttpContext) 97 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, контекст HttpContext) 256

Информация о версии: Microsoft .NET Framework Версия: 4.0.30319; ASP.NET Версия: 4.0.30319.237

Я просмотрел код, но не вижу ссылки на System.Web.WebPages.Razor только в версии 1.0 версии 2.0.

Ответ №1:

Используйте NuGet и добавьте пакет Microsoft.AspNet.Mvc (Microsoft Asp.Net Mvc 4). Это должно обновить ваши ссылки. См.:

https://nuget.org/packages/Microsoft .AspNet.Mvc

Вам нужно будет обновить ссылки на сборки в вашем web.config.

Удалить из корневого web.config:

 <assemblies>
  <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
  

Добавить в корневой web.config:

 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
  

Просмотры/Web.Config:

Измените Razor с 1.0.0.0 на 2.0.0.0:

 <configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

<pages validateRequest="false"
       pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>
  

Комментарии:

1. Я потерял поддержку intellisense VS 2010 на странице razor после изменений. пример; «@model MyClass» выглядит неправильно, но работает. что я должен сделать, чтобы вернуть поддержку intellisense?

2. Перейдите в меню Правка -> IntelliSense -> Обновить локальный кэш и 2) Нажмите Ctrl Shift R

3. Кроме того, мне также пришлось удалить a <add key="webpages:Version" value="1.0.0.0"/> , который у меня был в моей корневой конфигурации.

4. Я получаю ту же проблему после выполнения шагов, упомянутых выше. Я получаю ошибки времени компиляции 1. Не удалось загрузить тип ‘System.Web.Mvc.ViewUserControl’ И 2. Не удалось загрузить тип ‘System.Web.Mvc.ViewPage И 3. Не удалось загрузить тип ‘System.Web.Mvc.ViewMasterPage, хотя эта ошибка относится только к одному из моих проектов MVC. Остальные работают нормально, и я проверил, что классы, упомянутые в приведенном выше списке, действительно существуют в коде. Хммм … это ошибка, которая должна возникать во всех моих проектах обновления, а не только в одном. Любая помощь приветствуется

Ответ №2:

Вы забыли обновить ссылки в ViewsWeb.Config ? Ссылки в нем используются для создания страниц просмотра.

Комментарии:

1. Я уже проверил это, как вы можете видеть в комментариях ниже.

Ответ №3:

Я предположил, что у вас есть веб-приложение для внутренней сети MVC3, при обновлении с MVC3 до MVC4 с помощью NuGet ваше приложение теперь ссылается на System.Web.WebPages.Razor версии 2.0.0.0, А НЕ на System.Web.WebPages.Razor версии 1.0.0.0. Вот мой способ разрешения ссылки.

Есть два места, которые нужно исправить:

  1. В корневом web.config,

     <compilation debug="true" targetFramework="4.0">
      <assemblies>
        . . .
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        . . .
      </assemblies>
    </compilation>
      

измените версию = 1.0.0.0 на версию = 2.0.0.0

Итак, ваша новая ссылка будет выглядеть так:

     <compilation debug="true" targetFramework="4.0">
      <assemblies>
        . . .
        <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        . . .
      </assemblies>
    </compilation>
  
  1. В папке Views есть файл web.config. Проверив этот файл, вы увидите, что он ссылается на версию 1. Замените весь файл web.config в папке Views новым файлом web.config. На всякий случай сделайте резервную копию старого файла web.config. Чтобы получить совершенно новый web.config для папки Views, вы создаете новое приложение MVC4 для интрасети. Перейдите в папку Views. Скопируйте файл Web.Config из папки Views нового приложения в папку Views неработающего приложения.

Надеюсь, это поможет!

Ответ №4:

Переустановка пакетов AspNetSprite, как было предложено выше, не решает проблему для меня. Но добавление этих строк в раздел runtime assemblyBinding корневого файла web.config работает :

     <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  

Ответ №5:

Выполняли ли вы глобальный поиск System.Web.WebPages.Razor, Version = 1.0.0.0 во всем вашем решении? Вы все еще ссылаетесь System.Web.WebPages.Razor на (версию 1.0.0.0)? Вы ссылаетесь System.Web.WebPages.Razor на версию 2.0.0.0?


[Обновление]Я, наконец, столкнулся с той же проблемой. Похоже, что один из пакетов NuGet, которые я установил и удалил, не полностью удалил ссылку на System.Web.Razor него. Очистка решения не помогла, поскольку DLL не использовалась веб-приложением напрямую. Я, наконец, заставил его работать, вручную удалив весь каталог bin

Комментарии:

1. Я просмотрел все свое решение, нет смысла ссылаться на версию 1.0. Даже отредактированные файлы .csproj и .sln ищут эту ссылку. Но я не нашел.

Ответ №6:

Проверьте web.config в папке views.

Обновить:

Этот бит выглядит подозрительным.

Microsoft.Web.Samples.Предварительный код запуска приложения

Ссылаетесь ли вы на какие-либо примеры библиотек приложений, например, MVC futures или что-то в этом роде?

Комментарии:

1. Уже проверил все, нет ничего, указывающего на версию 1.0. Смотрите Корневой Web.config в: gist.github.com/1265901

2. Я не понимаю. Я ничего не нашел в web.config с Microsoft.Web.Samples.PreAppliaction... использованием Elmah , Melezes , Mvc.Mailer и AutoMapper

3. Я также использую эти библиотеки DLL .. Microsoft.Web.Samples.ImageOptimizationFramework и Microsoft.Web.Samples.SpriteHelper .. Но я не понимаю, как это может вызвать эту ошибку. Если это то, что является причиной этого.

4. @RidermandeSousaBarbosa — Ну, очевидно, что эти dll ссылаются на Razor и запрашивают версию 1.0. Очевидно, что проблема заключается в том, что пространства имен одинаковы.

Ответ №7:

В моем приложении использовался сторонний пакет AspNetSprites-MVC и razorhelper. Переустановил этот пакет, и ошибка ссылки была исправлена.

Ответ №8:

Это еще один пакет Nuget, который вы можете использовать для обновления mvc 3 до mvc 4 https://nuget.org/packages/UpgradeMvc3ToMvc4

Ответ №9:

это очень просто, когда вы обновляетесь до MVC 4.0.0.0 , но webconfig в решении по-прежнему указывает на MVC 3.0.0.0.0. так что просто замените версию MVC 3.0.0.0.0. на 4.0.0.0.0

Сделайте то же самое с другими сборками, чтобы проверить версию сборки, проверьте свойства соответствующей сборки в ссылках в вашем проекте.