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.


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.


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


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.


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


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


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


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


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


0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.