2014/10/17

Windows Update rompe aplicaciones web ASP.NET MVC 3 (patch version 3.0.0.1)

Si luego de una actualización de Windows Update has recibido alguno de los mensajes siguientes al querer compilar algún proyecto web:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): 
warning MSB3245: Could not resolve this reference. Could not locate the assembly "System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.

error CS0234: The type or namespace name 'Mvc' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)

Lo que ocurrió fue que windows update ha instalado un parche (hotfix) para la versión de runtime que tenías referenciada, por lo que deberás actualizar la referencia para que te vuelva a compilar sin problemas.

La solución que me ha funcionado de maravilla, es la siguiente:
http://stackoverflow.com/questions/26406877/asp-net-mvc-security-patch-to-version-3-0-0-1-breaks-build

Los pasos a seguir son los siguientes:

1) Borra la referencia a la versión en desuso de System.Web.Mvc en tus proyectos afectados (Versión 3.0.0.0)
Esto lo hacemos buscando la carpeta llamada "References" en el root de tu aplicación web MVC, luego buscando la referencia llamada "System.Web.Mvc" dentro de carpeta y haciendo botón derecho y click en "Remove"

2) Agregar la referencia a la nueva versión de System.Web.Mvc (Versión 3.0.0.1)
Esto lo hacemos sobre la carpeta "References", botón derecho y click en "Add Reference...", se abrirá una ventana de dialogo donde debemos buscar la versión nueva que necesitamos.

3) Cambiar la propiedad de la nueva referencia a Copia local.
Esto lo hacemos ubicando la nueva referencia que acabamos de agregar en la carpeta "References", botón derecho y click en "Properties", luego ubicar el ítem que dice "Copy Local" y cambiar el valor a TRUE.

4) Finalmente en nuestro web.config debemos cambiar la referencia también.
Esto lo hacemos ubicando la sección correspondiente y cambiando la linea vieja por la nueva.

 <runtime>  
   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
     <dependentAssembly>  
       <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />  
       <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.1" />  
     </dependentAssembly>  
   ...  

Al terminar todo esto y volver a compilar debería andar todo bien.