web-dev-qa-db-fra.com

InvalidCastException est levée après l'installation d'ASP.NET MVC 4 Beta

J'obtiens l'exception suivante après avoir installé ASP.NET MVC 4 Beta sur une machine avec ASP.NET MVC 3.

System.InvalidCastException n'a pas été géré par le code utilisateur Message = [A] System.Web.WebPages.Razor.Configuration.HostSection ne peut pas être converti en [B] System.Web.WebPages.Razor.Configuration.HostSection. Le type A provient de "System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35" dans le contexte "Default" à l'emplacement "C:\Windows\Microsoft.Net\Assembly\GAC_MSIL\System .Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll '. Le type B provient de "System.Web.WebPages.Razor, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35" dans le contexte "Default" à l'emplacement "C:\Windows\Microsoft.Net\Assembly\GAC_MSIL\System .Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll '. Source = System.Web.WebPages.Razor

Trace de la pile:

sur System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) sur System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String physicalPath) sur System.Web.WebPagFazForForGaz System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () sur System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () sur System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompCompiler.CodeCompilator.CodeCompilerConfiguration (System.Compas) GetCompilerTypeFromBuildProvider (BuildProvider buildProvider) sur System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () sur System.Web.Compilation.BuildProvidersCompiler.PerformBuild () sur System.Web.Compilation.PuildWorkCompileCompileWeb.Compilator.Compilation.BuildManager (System). BuildManager.GetVPathBuildResultInternal (VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean assureIsUpToDate) a t System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (HttpContext contexte, VirtualPath virtualPath, Boolean NOBUILD, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) à System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, HttpContext contexte, Boolean allowCrossApp, Boolean throwIfNotFound) sur System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists (String virtualPath) sur System.Web.Mvc.BuildManagerViewEngine.FileExists (ControllerContext controllerContext, System virtualWeb) .VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, List`1 locations, String name, String controllerName, String areaName, String cacheKey, String [] & RecherchéLocations) sur System.Web.Mvc.VirtualPathProviderViewEngine.GetPath (ControllerContext controllerContext, ControllerContext controllerContext, ControllerContext String [] areaLocations, String locationsPropertyName, S nom de chaîne, String controllerName, String cacheKeyPrefix, Boolean useCache, String [] &SearchLocations) sur System.Web.Mvc.VirtualPathProviderViewEngine.FindView (ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) sur System.Web.Mvc.ViewEngineCollection. <> c__DisplayClassc.b__b (IViewEngine e) sur System.Web.Mvc.ViewEngineCollection.Find (recherche Func`2, Boolean trackSearchedPaths) sur System.Web.Mvc.ViewEngineCollection.FindView (ControllerContext controllerContext, String viewName, String masterName) .Web.Mvc.ViewResult.FindView (contexte ControllerContext) sur System.Web.Mvc.ViewResultBase.ExecuteResult (contexte ControllerContext) sur System.Web.Mvc.ControllerActionInvoker.InvokeActionResult (ControllerContext controllerContext, ActionResult System actionResult ControllerActionInvoker. <> C__DisplayClass1c.b__19 () sur System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (filtre IResultFilter, ResultExecutingContext preContext, Fun c`1 continuation) sur System.Web.Mvc.ControllerActionInvoker. <> c__DisplayClass1c. <> c__DisplayClass1e.b__1b () sur System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, ILR ActionContextes, ILR Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) sur System.Web.Mvc.Controller.ExecuteCore () sur [project_namespace] .Controllers.GlobalizationController.ExecuteCore () dans [file_path] sur System.Wontroll.Bc. .Execute (RequestContext requestContext) sur System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) sur System.Web.Mvc.MvcHandler. <> C__DisplayClass6. <> C__DisplayClassb.b__ .Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass1.b__0 () sur System.Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass8`1.b__7 (IAsyncResult _) sur System.Web.Mvc.Async.AsyncResult `1.End () sur System.Web.Mvc.MvcHandler . <> c__DisplayClasse.b__d () sur System.Web.Mvc.SecurityUtil.b__0 (action f) sur System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (action) sur System.Web.Mvc.MvcHandler.EndProcessRequult (IAsyncResult) sur System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (résultat IAsyncResult) sur System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.ExSystem (Execute) étape, booléen et terminé de manière synchrone)

Cela me bloque complètement et même si je souhaite conserver la version bêta, je devrai peut-être la supprimer complètement afin de me débarrasser de l'exception.

82
Nikos Baxevanis

Essayez d'ajouter les éléments suivants dans votre web.config:

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

Le problème peut être dû à l'enregistrement de plusieurs fournisseurs de build et au dernier gagnant.

32
marcind

J'ai eu le même problème, mais lors de la migration d'ASP.NET MVC 3 vers ASP.NET MVC 4. De cette façon, j'ai abordé ce sujet. J'ai trouvé une solution au problème, mais sa source est différente, ce n'est pas de la version WebPages.

J'ai suivi le guide officiel (pour ainsi dire) Mise à niveau d'un projet ASP.NET MVC 3 vers ASP.NET MVC 4 .

Pour résoudre le problème, vous devez ajouter dans Web.Config (probablement autour de ceux précédemment ajoutés):

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

Également dans les notes n'est pas mentionné pour changer la référence de System.Web.Helpers de 1.0.0.0 à 2.0.0.0 (supprimez et ajoutez le nouveau).

102
Rolice

Une autre solution, plutôt tardive ... J'ai rencontré ce même problème. A fait tous les correctifs répertoriés ici (merci à tous !!!) mais n'a pas pu surmonter l'erreur. Enfin, désespéré, j'ai trouvé un fichier web.config dans le répertoire Views. Dans ce fichier, j'ai trouvé plusieurs références à la version de System.Web.Mvc et les ai toutes remontées jusqu'à "4.0.0.0". Plus important encore, j'ai trouvé les lignes suivantes et mis à jour les numéros de version pour "system.web.webPages.Razor" de "1.0.0.0" à "2.0.0.0" et soudain, tout fonctionnait à nouveau. J'espère que cela aidera quelqu'un d'autre.

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

Steve G.

34
Steve G

J'ai trouvé un autre moyen de faire fonctionner cela, le long de la ligne d'un blog taiwanais sur la mise à niveau de MVC 2 vers MVC 3: http://blog.kkbruce.net/2011_04_01_archive.html (Vous pouvez réellement utilisez Microsoft Translate dans IE10 pour voir la version anglaise et c'est une assez bonne traduction ...)

L'astuce consiste à trouver toutes les versions qui se rapportent à MVC3 (telles que les assemblages Razor, Mvc, Helper, vous saurez ce qu'elles sont si vous accédez à vos références et consultez toutes les versions plus récentes de votre assembly référencé) et les changez de 1.0.0.0 à 2.0.0.0 et de 3.0.0.0 à 4.0.0.0 (car les clés publiques sont les mêmes). Vous pouvez également essayer de supprimer les versions conformément au blog.

Une autre chose importante est que ces paramètres se trouvent dans tous les Web.Configs. Donc, non seulement sous votre racine, mais aussi sous Affichage, Zone/{Zone}/Vue, etc.

Je pense que cette solution peut vous permettre de passer complètement au MVC4 au lieu d'avoir un hybride, ce qui n'a pas fonctionné pour moi de toute façon.

5
laorient
  1. Dans Visual Studio, créez une nouvelle application ASP.NET MVC 4 "jetable" dans un dossier séparé quelque part.
  2. Remplacez le fichier web.config dans votre dossier Views par le fichier web.config Views nouvellement créé à partir de la nouvelle application jetable.

Tu remarqueras:

System.Web.WebPages.Razor change de Version=1.0.0.0 à Version=2.0.0.0System.Web.Mvc change de Version=3.0.0.0 à Version=4.0.0.0

4
James Lawruk

Si vous rencontrez ce problème et que vous avez essayé les solutions ci-dessus et que cela ne fonctionne pas, veuillez vérifier le web.config dans votre dossier Vues. Certaines configurations peuvent entrer en conflit avec le fichier Web.config dans le dossier racine de votre application

3
user1047559

Par souci d'exhaustivité ...

Vous pouvez également désactiver complètement les pages Web si vous ne les utilisez pas.

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

(Je ne suis pas encore tout à fait clair sur la relation entre les vues de rasoir et les pages Web, mais il semble que mon application MVC avec les vues de rasoir fonctionne toujours avec les pages Web désactivées.)

0
Peter

Aussi, comme dernière étape, effacez votre dossier bin du projet d'où provient l'erreur.

0
natdev1

Une partie de votre code s'exécute sur les bits MVC actuels, tandis que d'autres ont été poussés vers le plus récent. Sans comprendre le code, je ne peux pas vous dire quel bit spécifique est à l'origine du problème.

Cela dit, je ne mettrais jamais en place une version bêta sur une machine de développement de production. Il est trop facile de créer un VM ces jours-ci et d'exécuter la version bêta sur une image. Dans Windows 7+, vous pouvez démarrer l'image à partir du métal et ne pas prendre le coup de perf, si vous avez besoin cela (avec l'outil de développement beta, vous le faites souvent).

0
Gregory A Beamer