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

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

Исправление System.InvalidCastException не было обработано кодом пользователя       Сообщение = [A] System.Web.WebPages.Razor.Configuration.HostSection не может быть добавлено         к [B] System.Web.WebPages.Razor.Configuration.HostSection. Тип А возникает         от "System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = нейтральный,         PublicKeyToken = 31bf3856ad364e35 'в контексте" По умолчанию "в месте         " 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, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35"         в контексте "По умолчанию" в месте "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.03131bf3856ad364e35\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, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean обеспечиваетIsUpToDate)        в System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(контекст HttpContext, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean обеспечиваютIsUpToDate)        в System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, контекст HttpContext, Boolean allowCrossApp, Boolean 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 [] & lookLocations)        в System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String [] location, String [] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String [] & lookLocations)        в 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 lookup, 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.Mvc.ControllerActionInvoker. < > c__DisplayClass1c.b__19()        в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(фильтр IResultFilter, ResultExecutingContext preContext, продолжение Func`1)        в System.Web.Mvc.ControllerActionInvoker. < > c__DisplayClass1c. < > c__DisplayClass1e.b__1b()        в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1, ActionResult actionResult)        в System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)        в System.Web.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__DisplayClass1.b__0()        в System.Web.Mvc.Async.AsyncResultWrapper. < > c__DisplayClass8`1.b__7 (IAsyncResult _)        в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()        в System.Web.Mvc.MvcHandler. < > c__DisplayClasse.b__d()        в System.Web.Mvc.SecurityUtil.b__0 (Действие f)        в System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(действие действия)        в System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)        в System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(результат IAsyncResult)        в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()        на System.Web.HttpApplication.ExecuteStep(шаг IExecutionStep, логический и завершенный синхронно)

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

Ответ 1

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

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

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

Ответ 2

У меня была та же проблема, но при переносе 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>

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

Ответ 3

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

Стив G.

Ответ 4

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

Ответ 5

  • В Visual Studio создайте новое "одноразовое" приложение ASP.NET MVC 4 в отдельной папке.
  • Замените файл web.config в папке "Представления" со свежезаваренным файлом Views. web.config из нового приложения throwaway.

Вы заметите:

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Для полноты...

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

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

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

Ответ 9

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