Se lanza InvalidCastException después de instalar ASP.NET MVC 4 Beta

81

Recibo la siguiente excepción después de instalar ASP.NET MVC 4 Beta en una máquina con ASP.NET MVC 3.

System.InvalidCastException no se manejó con el código de usuario Message = [A] System.Web.WebPages.Razor.Configuration.HostSection no se puede convertir a [B] System.Web.WebPages.Razor.Configuration.HostSection. El tipo A se origina en 'System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' en el contexto 'Default' en la ubicación 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. El tipo B se origina en 'System.Web.WebPages.Razor, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' en el contexto 'Default' en la ubicación 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_2.0.0. 0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Fuente = System.Web.WebPages.Razor

StackTrace:

en System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) en System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String physicalPath) en System.Web.WebromGost System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () en System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () en System.Web.WebPages.Razor.RazorBuildr. GetCompilerTypeFromBuildProvider (BuildProvider buildProvider) en System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () en System.Web.Compilation.BuildProvidersCompiler.PerformBuild () en System.Web.Compilation.BuildManager.CompileWebFile (VirtualPath virtualPath) en System. , Booleano noBuild, booleano allowCrossApp, booleano allowBuildInPrecompile, booleano throwIfNotFound, booleano asegureIsUpToDate) en System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, HolepConbjectFactory, Boolean. Web.Mvc.IBuildManager.FileExists (String virtualPath) en System.Web.Mvc.BuildManagerViewEngine.FileExists (ControllerContext controllerContext, String virtualPath) en System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, List`1 ubicaciones, String name, String controllerName, String areaName, String cacheKey, String [] y buscadasLocations) en System.Web. Mvc.VirtualPathProviderViewEngine. (ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) en System.Web.Mvc.ViewEngineCollection. <> C__DisplayClassc.b__b (IViewEngine e) en System.Web.Mvc.ViewEngineCollection.Find (búsqueda de Func`2, Boolean trackSearchedPaths) en System.Web.Mvc.ViewEngineCollection.FindView (ControllerContext controllerContext, String viewName, String masterName) en System.Web.Mvc .ViewResult.FindView (contexto ControllerContext) en System.Web.Mvc.ViewResultBase.ExecuteResult (contexto ControllerContext) en System.Web.Mvc.ControllerActionInvoker.InvokeActionResult (ControllerContext controllerContext, ActionResult actionResult) en System.Web.Mvc.Controloker. c__DisplayClass1c.b__19 () en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (filtro IResultFilter, ResultExecutingContext preContext, continuación de Func`1) en System.Web.Mvc.ControllerActionInvoker. <> c__DisplayClass1c> c__DisplayClass1e.b__1b () en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, filtros IList`1, ActionResult actionResult) en System.Web.Mvc.ControllerActionInvoker.InvokeAction controller. Mvc.Controller.ExecuteCore () en [project_namespace] .Controllers.GlobalizationController.ExecuteCore () en [file_path] en System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) en System.Web.Mvc.ControllerBase.System.Web. Mvc.IController.Execute (RequestContext requestContext) en System.Web.Mvc.MvcHandler. <> C__DisplayClass6. <> C__DisplayClassb.b__5 () en System.Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass1.b__0 () en System. Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass8`1.b__7 (IAsyncResult _) en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () en System.Web.Mvc.MvcHandler. <>se c__DisplayClas System.Web.Mvc.SecurityUtil.b__0 (Acción f) en System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Acción de acción) en System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) en System.Web.Mandlervc.MvcHesult System.Web.IHttpAsyncHandler.EndProcessRequest (resultado IAsyncResult) en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpAppecutionStep.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () en System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () en System.Web.Mvc.SecurityUtil.b__0 (Acción f) en System.Web. Mvc.SecurityUtil. CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () en System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () en System.Web.Mvc.SecurityUtil.b__0 (Acción f) en System.Web. Mvc.SecurityUtil. CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)b__0 (Acción f) en System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Acción acción) en System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) en System.Web.Mvc.MvcHandler.System.Web.IHandlerque.As ( IAsyncResult result) en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)b__0 (Acción f) en System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Acción acción) en System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) en System.Web.Mvc.MvcHandler.System.Web.IHandlerque.As ( IAsyncResult result) en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completadoSincrónicamente)

Esto me bloquea por completo y, aunque me gustaría mantener la versión beta, es posible que deba eliminarla por completo para deshacerme de la excepción.

Nikos Baxevanis
fuente
1
¿Está ejecutando la vista previa de .net 4.5 Dev por casualidad? (Esa es incompatible con la versión Beta actual) (solo para que conste, no fui yo quien votó negativamente, la pregunta es legítima)
Michael Stum
1
No, no ejecuto el 4.5 en absoluto.
Nikos Baxevanis
3
En serio, ¿por qué se rechaza esto? Proporciono comentarios sobre algo que les pueda pasar a otras personas.
Nikos Baxevanis
@MichaelStum OK, no te preocupes. :)
Nikos Baxevanis
Perdón por la confusion. Estaba tratando de "marcar como favorito" esta pregunta y hice mal clic = P Se eliminó el voto negativo, favorito agregado correctamente esta vez.
Josh Darnell

Respuestas:

31

Intente agregar lo siguiente en su web.config:

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

El problema puede deberse a que se han registrado varios proveedores de compilación y el último ganador.

maridar
fuente
101

Tuve el mismo problema, pero al migrar ASP.NET MVC 3 a ASP.NET MVC 4. De esta manera llegué a este tema. He encontrado una solución al problema, pero su origen es diferente, no es de la WebPagesversión.

He seguido la guía oficial (por así decirlo) Actualización de un proyecto ASP.NET MVC 3 a ASP.NET MVC 4 .

Para resolver el problema, debe agregar Web.Config (probablemente alrededor de los agregados anteriormente):

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

Además, en las notas no se menciona cambiar la Referencia de System.Web.Helpers de 1.0.0.0 a 2.0.0.0 (eliminar y agregar la nueva).

Rolice
fuente
2
+1 Muchas gracias por compartir. Una pequeña variación que hice fue usar oldVersion="1.0.0.0-2.0.0.0"solo para seguir la convención utilizada en la plantilla de proyecto MVC4. Curiosamente, dependentAssemblyfor System.Web.WebPages.Razortambién está ausente del Web.config raíz en la plantilla del proyecto MVC4.
Scotty.NET
1
Tuve un problema similar al actualizar los paquetes MVC 4 NuGet a 5.1.1, resuelto con lo anterior, perooldVersion="2.0.0.0" newVersion="3.0.0.0"
Luke Puplett
34

Una solución más, bastante tardía ... Me encontré con el mismo problema. Hice todas las correcciones enumeradas aquí (¡¡¡Gracias a todos !!!), pero no pudo superar el error. Finalmente, desesperado, encontré un archivo web.config en el directorio Vistas. En este archivo, encontré varias referencias a la versión de System.Web.Mvc y las subí todas a "4.0.0.0". Más importante aún, encontré las siguientes líneas y actualicé los números de versión de "system.web.webPages.Razor" de "1.0.0.0" a "2.0.0.0" y, de repente, todo volvió a funcionar. Con suerte, esto ayudará a alguien más.

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

Steve G
fuente
1
Además, no se olvide de web.config en Áreas / Vistas si está utilizando Áreas.
Antonin Jelinek
5

Encontré otra forma de hacer que esto funcione, en la línea del blog de un taiwanés sobre la actualización de MVC 2 a MVC 3: http://blog.kkbruce.net/2011_04_01_archive.html (En realidad, puede usar Microsoft Translate en IE10 para ver la versión en inglés y es una traducción bastante buena ...)

El truco consiste en encontrar todas las versiones que se relacionan con MVC3 (como Razor, Mvc, ensamblajes auxiliares, sabrá cuáles son si va a sus referencias y revisa todas las versiones más nuevas de su ensamblaje referenciado) y cámbielas de 1.0.0.0 a 2.0.0.0 y de 3.0.0.0 a 4.0.0.0 (ya que las claves públicas son las mismas). También puede intentar eliminar las versiones según el blog.

Otra cosa importante es que estas configuraciones están en todas las Web.Configs. Entonces, no solo debajo de su raíz, sino también en Ver, Área / {Área} / Vista, etc.

Siento que esta solución puede permitirle actualizar a MVC4 por completo en lugar de tener un híbrido, que de todos modos no funcionó para mí.

laoriente
fuente
4
  1. En Visual Studio, cree una nueva aplicación ASP.NET MVC 4 "desechable" en una carpeta separada en algún lugar.
  2. Reemplace el archivo web.config en su carpeta Views con el archivo web.config Views recién creado de la nueva aplicación desechable.

Te darás cuenta:

System.Web.WebPages.Razorcambia de Version=1.0.0.0a Version=2.0.0.0 System.Web.Mvccambia de Version=3.0.0.0aVersion=4.0.0.0

James Lawruk
fuente
3

Si está experimentando este problema y ha probado las soluciones anteriores y esto no funciona, consulte el archivo web.config en su carpeta Vistas. Puede haber algunas configuraciones que entren en conflicto con el archivo Web.config en la carpeta raíz de su aplicación

usuario1047559
fuente
0

Parte de su código se está ejecutando en los bits MVC actuales, mientras que otros se han enviado a los más nuevos. Sin entender el código, no puedo decirle qué bit específico está causando el problema.

Habiendo dicho eso, nunca instalaría una versión beta en una máquina de desarrollo de producción. Es demasiado fácil crear una máquina virtual en estos días y ejecutar la versión beta en una imagen. En Windows 7+, puede arrancar la imagen desde el metal y no recibir el golpe de rendimiento, si lo necesita (con las betas de herramientas de desarrollo, a menudo lo hace).

Gregory A Beamer
fuente
Sí, pero esta Beta tiene una licencia de puesta en marcha. Después de todo, está en una VM de todos modos, pero la VM también tiene ASP.NET MVC 3.
Nikos Baxevanis
Debe determinar qué bit en 3 se está ejecutando en 4, ya que ahí es donde está teniendo el conflicto. Lo mismo sucedió bastante en Web Forms a medida que se movieron al marco de tiempo de .NET 2 y fue un gran problema con los complementos (¿como MVC?).
Gregory A Beamer
En realidad, es un proyecto ASP.NET MVC 3 muy grande. No se está ejecutando nada en 4. No pude iniciar el proyecto 3, eso es todo. La adición de <add key = "webpages: Version" value = "1.0.0.0" /> en el elemento appSettings solucionó el problema.
Nikos Baxevanis
0

En aras de la exhaustividad...

También puede desactivar las páginas web por completo si no las está utilizando.

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

(Todavía no tengo del todo claro la relación entre las vistas de afeitar y las páginas web, pero parece que mi aplicación MVC con vistas de afeitar todavía funciona con las páginas web desactivadas).

Pedro
fuente
0

Además, como último paso, borre la carpeta bin del proyecto de donde proviene el error.

natdev1
fuente