Las excepciones no "simplemente suceden" de vez en cuando. Siempre ocurren por razones válidas, algunas de las cuales ya están enumeradas en las otras respuestas.
Sin embargo, para aliviar los problemas con ViewState, considere desactivarlo por completo. Como desarrolladores de ASP.NET, solemos utilizar ViewState en todo tipo de lugares donde no es necesario porque es el predeterminado.Normalmente pienso en usar static html antes de considerar usar un control. Si decide usar un control, piense si realmente necesita que ViewState esté habilitado. Deshabilitarlo a menudo conduce a mejores tiempos de carga de la página, por lo que si puedes, hazlo.
Ojalá estuviera deshabilitado por defecto, por lo que las personas se vieron obligadas a pensar de esta manera, pero no es así.
actualización para responder a un comentario:
de la parte superior de mi cabeza me ocurren 3 oportunidades para apagar ViewState.
Deshabilitar ViewState si los datos se cargan en cada devolución. Este será a menudo el caso si está creando sitios habilitados para AJAX (real AJAX no ese tipo de UpdatePanel;)), donde normalmente carga datos en la primera carga y luego recarga/actualiza datos usando solicitudes AJAX. En algunos casos, incluso podría cargar datos en cada visita con el único propósito de deshabilitar ViewState, y luego almacenar en caché los datos en el servidor.
También puede considerar deshabilitar ViewState si se enlaza con contenido que es realmente estático. A veces encuentro una lista que está unida a datos a una pequeña tabla de datos base estáticos en la base de datos o algo así. Ahora, esto puede ser peligroso, pero si estoy convencido de que los datos no cambiarán, podría mover los datos a la página como contenido estático (podría envolverlo en un control separado para que no tenga varias copias estáticas de los datos).) Pero si los datos cambian entonces, tendrá que cambiarlos manualmente.
Los controles simples como las etiquetas suelen ser buenos candidatos para deshabilitar ViewState.
Finalmente se podía cambiar a marco ASP.NET MVC y adiós a estos problemas para siempre, eso es lo que planeo hacer, incluso si me voy a enfrentar algunos otros problemas. ;)
¿Puede dar más detalles sobre el tema 2? –
Well viewstate contiene una firma para evitar que alguien lo edite en el lado del cliente. Esa firma se genera desde la clave de la máquina para el servidor. A menos que configure una clave de máquina específicamente, se regenera cuando se reinicia el grupo de aplicaciones, lo que hace que todos los viewstates anteriores se vuelvan inválidos. Si tiene autenticación de usuario, también debe establecer una ViewStateUserKey para protegerse contra CSRF. – blowdart