InvalidCastException выбрасывается после установки ASP.NET MVC 4 Beta - PullRequest
82 голосов
/ 23 февраля 2012

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

System.InvalidCastException не было обработано кодом пользователя Сообщение = [A] System.Web.WebPages.Razor.Configuration.HostSection не может быть приведено [B] System.Web.WebPages.Razor.Configuration.HostSection. Тип А происходит из 'System.Web.WebPages.Razor, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 'в контексте' Default 'в местоположении "C: \ Windows \ Microsoft.Net \ сборка \ GAC_MSIL \ System.Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll. Тип B происходит от 'System.Web.WebPages.Razor, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35' в контексте «По умолчанию» в расположении «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

StackTrace:

в System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) в System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String PhysicalPath) в System.Web.WebPages.Razor.RazorBuildProvider.GetHostFromConfig () в System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () в System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () в System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType () в System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider (BuildProvider buildProvider) в System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () в System.Web.Compilation.BuildProvidersCompiler.PerformBuild () в System.Web.Compilation.BuildManager.CompileWebFile (VirtualPath virtualPath) в System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (VirtualPath virtualPath, логический noBuild, логический allowCrossApp, логический allowBuildInPrecompile, логический throwIfNotFound, логический гарантироватьIsUpToDate) в System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (контекст HttpContext, VirtualPath virtualPath, логический noBuild, логический allowCrossApp, логический allowBuildInPrecompile, логический throwIfNotFound, Boolean гарантировать) в System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, контекст HttpContext, логическое allowCrossApp, логическое throwIfNotFound) в System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists (String virtualPath) в System.Web.Mvc.BuildManagerViewEngine.FileExists (ControllerContext controllerContext, String virtualPath) в System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, List`1 location, String name, String controllerName, String areaName, String cacheKey, String [] & SearchLocations) в System.Web.Mvc.VirtualPathProviderViewEngine.GetPath (ControllerContext controllerContext, String [] местоположения, String [] areaLocations, String locationPropertyName, имя строки, имя контроллера строки, строка cacheKeyPrefix, логическое значение useCache, строка [] в System.Web.Mvc.VirtualPathProviderViewEngine.FindView (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, логический 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.Mvc.ControllerActionInvoker. <> c__DisplayClass1c.b__19 () в System.Web.ИнтерфейсФорумПредприятияИнтерфейсФорумПредприятияКакПродолжение Func`1) в System.Web.Mvc.ControllerActionInvoker. <> C__DisplayClass1c. <> C__DisplayClass1e.b__1b () в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFiltesWeb.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) в System.Web.Mvc.Controller.ExecuteCore () в [имя_проекта_пространства] .Controllers.GlobalizationController.ExecuteCore () в [file_prolc.v.at.bat.Mase.Wath.MB) в [file_prolc.v.at.bat.M].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__DisplayClass1.b__0 () в System.Web.Mvc.Async.ra.c__DisplayClass8`1.b__7 (IAsyncResult _) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () в System.Web.Mvc.MvcHandler. <> c__DisplayClasse.b__d () в System.W.SecurityUtil.b__0 (Действие f) в System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Действие) в System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) в System.Web.Mvc.MvcHandler.IandAsH.Wp.EndProcessRequest (результат IAsyncResult) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep * * IExecutionShone0 1000 выполненный шагполностью блокирует меня, и хотя я хотел бы сохранить бета-версию, мне может потребоваться полностью удалить ее, чтобы избавиться от исключения.

Ответы [ 9 ]

102 голосов
/ 11 мая 2012

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

Я следовал официальному руководству (так сказать) Обновление ASP.NET MVC3 Проект в 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>

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

34 голосов
/ 11 января 2013

Еще одно, довольно позднее, решение ... Я столкнулся с той же проблемой.Сделал все исправления, перечисленные здесь (всем спасибо !!!), но не смог обойти ошибку.Наконец, в отчаянии я нашел файл 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>

Стив Г.

32 голосов
/ 23 февраля 2012

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

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

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

5 голосов
/ 05 марта 2012

Я нашел другой способ заставить это работать, в дополнение к блогу тайваньца об обновлении с 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 голосов
/ 24 мая 2013
  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 голосов
/ 21 января 2013

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

0 голосов
/ 31 мая 2013

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

0 голосов
/ 28 июня 2012

Ради полноты ...

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

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

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

0 голосов
/ 23 февраля 2012

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

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

...