Compartir a través de


Solución de problemas de viewstate no válidos

por Apurva Joshi

Herramientas usadas en este solucionador de problemas:

  • N/D

Este material se proporciona únicamente con fines informativos. Microsoft no ofrece garantía alguna, ya sea expresa o implícita,

Información general

El estado de vista es una característica de ASP.NET que permite a las páginas conservar automáticamente el estado sin depender del estado del servidor (por ejemplo, el estado de sesión). Sin embargo, los problemas relacionados con el estado de vista pueden ser difíciles de depurar. En la mayoría de los casos, cuando se producen problemas con el estado de vista, recibe el siguiente mensaje de error en el explorador web, con poca indicación de lo que podría estar causando el problema:

"The viewstate is invalid for this page and might be corrupted"

En este artículo se describen algunas técnicas que se pueden usar para la depuración y para resolver problemas con el estado de vista.

Escenarios y solución de problemas

Compruebe que no está experimentando problemas que se han corregido

Se han corregido varios problemas de estado de vista con ASP.NET 1.0 revisiones y Service Packs, y esas correcciones también forman parte de ASP.NET 1.1. Asegúrese de que ha aplicado las correcciones más recientes antes de realizar el seguimiento de los problemas que ya se han resuelto. Puede obtener las actualizaciones más recientes de Microsoft .NET Framework del siguiente sitio web de Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/netframework/aa569276.aspx

Establezca el atributo validationKey si se ejecuta en una granja de servidores web

En una granja de servidores web, cada solicitud de cliente puede ir a una máquina diferente en cada postback. Debido a este comportamiento, no puede dejar el atributo validationKey establecido en AutoGenerate en el archivo Machine.config. En su lugar, debe establecer el valor del atributo validationKey en una cadena fija compartida por todas las máquinas de la granja de servidores web.

Para obtener más información sobre este problema, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:

https://support.microsoft.com/kb/323744

No almacene tipos generados dinámicamente en estado de vista en una granja de servidores web

Cuando ASP.NET compila archivos dinámicamente, los archivos se integran en ensamblados con nombres esencialmente aleatorios (por ejemplo, un nombre de archivo podría ser jp395dun.dll). Si ejecuta una granja de servidores web, los mismos archivos se compilarán en ensamblados con nombres aleatorios diferentes. Normalmente, esto no es un problema porque nadie realiza suposiciones en esos nombres de ensamblado. Pero si alguna vez coloca un tipo compilado dinámicamente en estado de vista mediante la serialización binaria, el nombre del ensamblado se incluirá como parte de los datos de estado de vista. Cuando ese estado de vista se envía más adelante a un servidor diferente de la granja de servidores web, no se puede deserializar el estado de vista porque usa nombres de ensamblado diferentes.

La mejor solución a este problema es evitar el uso de la serialización binaria. La serialización binaria usa muchos recursos incluso cuando no se produce este problema. En su lugar, limite lo que coloca en estado de vista a una combinación de matrices, pares, triples y tipos simples (por ejemplo, cadenas, int y otros tipos). System.Web.UI.Pair y System.Web.UI.Triplet son tipos de contenedor simples que el motor de estado de vista puede procesar eficazmente.

Una solución alternativa para evitar este problema es mover los tipos que está almacenando en estado de vista a un ensamblado precompilado, ya sea en la carpeta Bin o en la caché global de ensamblados. Esta corrección no aborda el rendimiento, pero garantiza que el ensamblado tiene el mismo nombre en todos los equipos.

Nota Si almacena tipos de datos complejos en el estado de vista y experimenta este problema, la información de la pila de llamadas contendrá pilas similares a las siguientes:

[FileNotFoundException: Could not load file or assembly 'App_Web_fx--sar9, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.]
 System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName) +0
System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +72
System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +58
System.Type.GetType(String typeName, Boolean throwOnError) +57
System.Web.UI.ObjectStateFormatter.DeserializeType(SerializerBinaryReader reader) +192 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +943 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +384 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +198 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +210 
System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader) +198 
System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream) +142

Determinar si el problema está relacionado con la característica MAC de estado de vista

El propósito de la característica de código de autenticación de máquina de estado de vista (MAC) es hacer imposible que los clientes envíen una solicitud que contenga un estado de vista malintencionado. De forma predeterminada, esta característica está habilitada en la marca siguiente en el archivo Machine.config.

enableViewStateMac="true"

La manera más sencilla de determinar si el problema con el que se está tratando está relacionado con la característica MAC es desactivar la característica. Para ello, cambie la marca en el archivo Machine.config por el código siguiente.

enableViewStateMac="false"

Si ya no obtiene errores de estado de vista, el problema está relacionado con la característica MAC.

Importante

Desactive solo la característica MAC de estado de vista para ayudar a diagnosticar el problema. No debe mantener el estado de vista MAC desactivado para solucionar el problema. Si es así, podría introducir agujeros de seguridad

En general, Microsoft recomienda que no desactive la característica MAC de estado de vista, a menos que esté completamente seguro de que ha deshabilitado el estado de vista para todos los controles que no codifican HTML su salida (por ejemplo, controles DataGrid, controles DataList, controles de etiqueta y otros controles) o que siempre establece explícitamente sus valores en cada solicitud en algo que se sabe que es seguro.

Determinar exactamente qué excepción se produce cuando recibe el mensaje de error

Desafortunadamente, el mensaje de error de estado de vista no válido que se menciona en la sección "Información general" de este artículo no es muy informativo. El mensaje de error suele deberse a que se produce alguna excepción cuando se procesa el estado de vista. El problema es que se consume la excepción y sus detalles se pierden en el mensaje de error.

Mediante un depurador, puede determinar la excepción original. Para ello, debe adjuntar un depurador al proceso de ASP.NET (Aspnet_wp.exe o W3wp.exe) y, a continuación, establecerlo para detectar todas las excepciones. Incluso puede configurar la herramienta Debug Diagnostics 1.2 para capturar excepciones administradas.

Pruebe a almacenar el estado de vista en la sesión.

De forma predeterminada, el estado de vista se realiza de ida y vuelta mediante un <campo INPUT type=hidden> que se envía al explorador. A continuación, el explorador devuelve el campo al servidor en la siguiente solicitud. En algunos casos, este estado de vista puede ser bastante grande y ser un posible origen de problemas. Algunos exploradores no pueden controlar un campo oculto grande (y la solicitud grande resultante) y los exploradores pueden truncar el estado de vista. Truncar el estado de vista provoca un mensaje de error "estado de vista dañado". Es más probable que este comportamiento se produzca en exploradores más sencillos. Por ejemplo, este comportamiento puede producirse en un explorador en un PDA.

Para determinar si puede encontrarse con este problema, intente almacenar el estado de vista en la sesión. En el ejemplo siguiente se muestra cómo hacerlo:

<%@ language=c# debug=true %> 
<script runat=server> 
protected override object LoadPageStateFromPersistenceMedium() 
{ 
     return Session["_ViewState"]; 
}
 
protected override void SavePageStateToPersistenceMedium(object viewState) 
{ 
     Session["_ViewState"] = viewState; 
}
 
void TextChanged(object o, EventArgs e) 
{ 
     Response.Write("TextChanged"); 
} 
</script> 
<form runat=server> 
<asp:button text=Test runat=server/> 
<asp:textbox ontextchanged=TextChanged runat=server/> 
<input type=hidden name=__VIEWSTATE> 
</form>

La siguiente línea de código solo es necesaria en ASP.NET 1.0 para solucionar un error. En ASP.NET 1.1 más, no es necesario.

<input type=hidden name=__VIEWSTATE>

Determinar si el problema está causado por el reciclaje de procesos de trabajo

Considere el siguiente escenario:

  • Está ejecutando ASP.NET en Microsoft Internet Information Services (IIS) 6.0.
  • El grupo de aplicaciones se ejecuta en una identidad distinta de la cuenta del sistema local, la cuenta de servicio de red o una cuenta de nivel administrativo.
  • El atributo validationKey del <elemento MACHINEKEY> se establece en AutoGenerate en el archivo de configuración.

En este escenario, el procedimiento siguiente hará que se produzca un error de estado de vista:

  1. Un usuario examina una página.
  2. Proceso de trabajo que hospeda el ASP.NET aplicación recicla.
  3. El usuario publica de nuevo la página.

La solución alternativa para este escenario es usar un atributo validationKey explícito en el archivo de configuración.

Otros recursos