InvalidCastException возникает после установки бета-версии ASP.NET MVC 4

81

Я получаю следующее исключение после установки бета-версии ASP.NET MVC 4 на машине с ASP.NET MVC 3.

Исключение System.InvalidCastException не было обработано пользовательским кодом Message = [A] System.Web.WebPages.Razor.Configuration.HostSection не может быть преобразован в [B] System.Web.WebPages.Razor.Configuration.HostSection. Тип A происходит из System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35 в контексте Default в расположении C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Тип B происходит из 'System.Web.WebPages.Razor, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35' в контексте 'Default' в расположении 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_2.0.0. 0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Источник = System.Web.WebPages.Razor

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

в System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) в System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String physicalPath) at System.WebRazorHostFactory. System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () в System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () в System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompiler (System.Web.WebPages.Razor.RazorBuildProvider.get_Code) GetCompilerTypeFromBuildProvider (BuildProvider buildProvider) в System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () в System.Web.Compilation.BuildProvidersCompiler.PerformBuild () в System.Web.Compilation.BuildManager.CompileWebFile (виртуальный_путь виртуальный_путь) при System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (виртуальный_путь виртуальный_путь, булевой noBuild, булевой allowCrossApp, Boolean, Boolean allowBuildInPrecompile throwIfNotFound, Boolean ensureIsUpToDate) при System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (HttpContext контексте, виртуальный_путь виртуальный_путь , Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean sureIsUpToDate) в System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (Boolean, VirtualPathManager.GetVirtualPathObjectFactory. Web.Mvc.IBuildManager.FileExists (String virtualPath) в System.Web.Mvc.BuildManagerViewEngine.FileExists (ControllerContext controllerContext, String virtualPath) в System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, местоположения List`1, имя строки, String controllerName, String areaName, String cacheKey, String [] и searchledLocations) в System.Web. Mvc.VirtualPathProviderViewEngine.GetPath (ControllerContext controllerContext, String [] location, String [] areaLocations, String locationPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String [] и searchledLocations) в System.Web.Mvc.VirtualEngView (ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) в System.Web.Mvc.ViewEngineCollection. <> C__DisplayClassc.b__b (IViewEngine e) в System.Web.Mvc.ViewEngineCollection.Find (поиск Func`2, Boolean trackSearchedPaths) в System.Web.Mvc.ViewEngineCollection.FindView (ControllerContext controllerContext, String viewName, String masterName) в System.Web.Mvc .ViewResult.FindView (контекст ControllerContext) в System.Web.Mvc.ViewResultBase.ExecuteResult (контекст ControllerContext) в System.Web.Mvc.ControllerActionInvoker.InvokeActionResult (ControllerContext controllerContext, ActionResult actionResult) в System.Web.Controler. c__DisplayClass1c.b__19 () в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (фильтр IResultFilter, преконтекст ResultExecutingContext, продолжение Func`1) в System.Web.Mvc.ControllerActionInvokerplay <> c__Dis> c__DisplayClass1e.b__1b () в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, фильтры IList`1, ActionResult actionResult) в System.Web.Mvc.ControllerActionInvoker.InvokeName контроллер. Mvc.Controller.ExecuteCore () в [project_namespace] .Controllers.GlobalizationController.ExecuteCore () в [file_path] в System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) в System.Web.Mvc.ControllerBase.System.Web. Mvc.IController.Execute (RequestContext requestContext) в System.Web.Mvc.MvcHandler. <> C__DisplayClass6. <> C__DisplayClassb.b__5 () в System.Web.Mvc.Async.AsyncResultWrapper. <> C__Display0Class1. Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass8`1.b__7 (IAsyncResult _) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () в System.Web.Mv__MvcHandlerplay () в System.Web. System.Web.Mvc.SecurityUtil.b__0 (действие f) в System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (действие действия) в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mv.Mvc. System.Web.IHttpAsyncHandler.EndProcessRequest (результат IAsyncResult) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.WebecutionStep.Execute () в System.Web.ExecutionStep.Execute () в System.WebecutionStepouslyWeb.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () в System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () в System.Web.Mvc.SecurityUtil.b__0 (Action f) в System.Web. Mvc.SecurityUtil.ProcessInApplicationTrust (действие действия) в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.System.Web.IHttpAsyncHandler.EndProcess (IHttpAsyncHandler.EndProcess). CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое значение и завершено синхронно)Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () в System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () в System.Web.Mvc.SecurityUtil.b__0 (Action f) в System.Web. Mvc.SecurityUtil.ProcessInApplicationTrust (действие действия) в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.System.Web.IHttpAsyncHandler.EndProcess (IHttpAsyncHandler.EndProcess). CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое значение и завершено синхронно)b__0 (Действие f) в System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Действие) в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mvc.MvcHandler.System.Web.IH IAsyncResult) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep завершен, Boolean)b__0 (Действие f) в System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Действие) в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mvc.MvcHandler.System.Web.IH IAsyncResult) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep завершен, Boolean)HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое значение и завершено синхронно)HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое значение и завершено синхронно)

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

Никос Баксеванис
источник
1
Вы случайно не запускаете предварительную версию .net 4.5 Dev? (Этот несовместим с текущей бета-версией) (для протокола, не я проголосовал против, вопрос законный)
Майкл Штум
1
Нет, я вообще не использую 4.5.
Никос Баксеванис,
3
Серьезно, почему это отвергается? Я оставляю отзывы о том, что может случиться с другими.
Никос Баксеванис,
@MichaelStum Хорошо, не беспокойтесь. :)
Никос Баксеванис
Извините за путаницу. Я пытался добавить этот вопрос в избранное и неправильно щелкнул = P Голосование против удалено, на этот раз избранное добавлено правильно.
Джош Дарнелл,

Ответы:

31

Попробуйте добавить в свой web.config следующее:

<appSettings>
  <add key="webpages:Version" value="1.0.0.0"/>
</appSettings>

Проблема может быть связана с регистрацией нескольких поставщиков сборки и последним выигрышем.

Марсинд
источник
101

У меня была такая же проблема, но при переносе ASP.NET MVC 3 на ASP.NET MVC 4. Таким образом я попал в эту тему. Я нашел решение проблемы, но его источник другой, не от WebPagesверсии.

Я следовал официальному руководству (так сказать) по обновлению проекта ASP.NET MVC 3 до ASP.NET MVC 4 .

Чтобы решить эту проблему, вам нужно добавить в Web.Config (возможно, около ранее добавленных):

<runtime><!-- Should be there by default, near end -->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><!-- Should be there by default -->
    <dependentAssembly>..</dependentAssembly><!-- Should be there by default -->
        ... some other dependecy redirects ...

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

        ... some other dependency redirects ...
    </assemblyBinding>
</runtime>

Также в примечаниях не упоминается об изменении Reference of System.Web.Helpers с 1.0.0.0 на 2.0.0.0 (удалите и добавьте новый).

Rolice
источник
2
+1 Спасибо огромное за то, что поделились. Одно небольшое изменение, которое я сделал, заключалось в том, oldVersion="1.0.0.0-2.0.0.0"чтобы следовать соглашению, используемому в шаблоне проекта MVC4. Интересно, что dependentAssemblyfor System.Web.WebPages.Razorтакже отсутствует в корневом файле Web.config в шаблоне проекта MVC4.
Scotty.NET
1
У меня была аналогичная проблема с обновлением пакетов NuGet MVC 4 до 5.1.1, решенная с помощью вышеуказанного, ноoldVersion="2.0.0.0" newVersion="3.0.0.0"
Люк Пуплетт
34

Еще одно, довольно позднее решение ... Я столкнулся с той же проблемой. Сделал все исправления, перечисленные здесь (спасибо всем !!!), но не смог обойти ошибку. Наконец, в отчаянии я нашел файл web.config в каталоге Views. В этом файле я нашел несколько ссылок на версию System.Web.Mvc и увеличил их до "4.0.0.0". Что еще более важно, я нашел следующие строки и обновил номера версий для «system.web.webPages.Razor» с «1.0.0.0» на «2.0.0.0», и внезапно все снова заработало. Надеюсь, это поможет кому-то другому.

<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>

Стив Г.

Стив Дж.
источник
1
Также не забудьте про web.config в разделе «Области / представления», если вы используете области.
Антонин Елинек
5

Я нашел другой способ заставить это работать, по пути к тайваньскому блогу об обновлении с MVC 2 до MVC 3: http://blog.kkbruce.net/2011_04_01_archive.html (вы можете использовать Microsoft Translate в IE10, чтобы увидеть английская версия, и это довольно хороший перевод ...)

Хитрость заключается в том, чтобы найти все версии, которые относятся к MVC3 (например, сборки Razor, Mvc, Helper, вы узнаете, что они собой представляют, если перейдете к своим ссылкам и проверите все более новые версии вашей сборки, на которую ссылаетесь) и измените их с 1.0.0.0 до 2.0.0.0 и от 3.0.0.0 до 4.0.0.0 (поскольку открытые ключи одинаковы). Вы также можете попробовать удалить версии, указанные в блоге.

Еще важно то, что эти настройки есть во всех Web.Configs. Так что не только под root-доступом, но и под View, Area / {Area} / View и т. Д.

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

неопытный
источник
4
  1. В Visual Studio создайте новое «одноразовое» приложение ASP.NET MVC 4 в отдельной папке где-нибудь.
  2. Замените файл web.config в папке Views на только что созданный файл Views web.config из нового одноразового приложения.

Вы заметите:

System.Web.WebPages.Razorменяется с Version=1.0.0.0на Version=2.0.0.0 System.Web.Mvcменяется с Version=3.0.0.0наVersion=4.0.0.0

Джеймс Лорук
источник
3

Если у вас возникла эта проблема, и вы попробовали описанные выше решения, но это не сработало, проверьте файл web.config в папке «Просмотры». Могут быть некоторые конфигурации, которые конфликтуют с файлом Web.config в корневой папке вашего приложения.

user1047559
источник
0

Некоторые из ваших кодов работают с текущими битами MVC, тогда как другие были перенесены на более новые. Не понимая кода, я не могу сказать, какой именно бит вызывает проблему.

Сказав это, я бы никогда не стал устанавливать бета-версию на производственной машине для разработки. В наши дни слишком просто создать виртуальную машину и запустить бета-версию образа. В Windows 7+ вы можете загружать образ с металла и не получать перфоманс, если вам это нужно (с бета-версиями инструмента разработки вы часто этого не делаете).

Грегори А Бимер
источник
Да, но у этой бета-версии есть действующая лицензия. В конце концов, это в любом случае на виртуальной машине, но на виртуальной машине также есть ASP.NET MVC 3.
Никос Баксеванис,
Вам нужно определить, какой бит в 3 работает в 4, поскольку именно здесь у вас возникает конфликт. То же самое происходило довольно часто в веб-формах, когда они перешли во временные рамки .NET 2, и было серьезной проблемой с любыми надстройками (например, MVC?).
Грегори А. Бимер
Собственно, это очень большой проект ASP.NET MVC 3. В 4 ничего не запускается. Не удалось запустить 3 проекта и все. Добавление <add key = "webpages: Version" value = "1.0.0.0" /> в элемент appSettings решило эту проблему.
Никос Баксеванис,
0

Для полноты картины ...

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

<appSettings>
    <add key="webpages:Enabled" value="false" />
</appSettings>

(Я до сих пор не совсем понимаю связь между представлениями бритвы и веб-страницами, но, похоже, мое приложение MVC с видами бритвы все еще работает с отключенными веб-страницами.)

Питер
источник
0

Также в качестве последнего шага очистите папку bin от проекта, в котором возникла ошибка.

natdev1
источник