Qué causa esta " Longitud no válida para una matriz de caracteres Base-64"


Tengo muy poco que hacer aquí. No puedo reproducir esto localmente, pero cuando los usuarios reciben el error, recibo una notificación automática de excepción por correo electrónico:

Invalid length for a Base-64 char array.

  at System.Convert.FromBase64String(String s)
  at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
  at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
  at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
  at System.Web.UI.HiddenFieldPageStatePersister.Load()

Me inclino a pensar que hay un problema con los datos que se asignan a viewstate. Por ejemplo:

List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;

Es difícil adivinar la fuente del error sin poder reproducirlo localmente.

Si alguien ha tenido alguna experiencia con este error, realmente me gustaría saber lo que averiguar.

Author: Michael, 2009-05-13

12 answers

He visto este error causado por la combinación de viewstate de buen tamaño y dispositivos/firewalls de filtrado de contenido agresivos (especialmente cuando se trata de instituciones educativas K-12).

Lo solucionamos almacenando Viewstate en SQL Server. Antes de ir por esa ruta, recomendaría intentar limitar su uso de viewstate no almacenando nada grande en él y apagándolo para todos los controles que no lo necesitan.

Referencias para almacenar ViewState en SQL Servidor:
MSDN-Descripción general de PageStatePersister
ASP Alliance-Método simple para almacenar viewstate en SQL Server
Code Project - ViewState Provider Model

 35
Author: Jimmie R. Houts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-17 04:50:40

Después de que urlDecode procesa el texto, reemplaza todos los caracteres '+' con '' ... de ahí el error. Simplemente debe llamar a esta declaración para que sea compatible con base 64 de nuevo:

        sEncryptedString = sEncryptedString.Replace(' ', '+');
 80
Author: Jalal El-Shaer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-16 10:52:13

Mi conjetura es que algo está codificando o decodificando demasiado a menudo , o que tienes texto con varias líneas.

Las cadenas Base64 tienen que ser un múltiplo de 4 caracteres de longitud - cada 4 caracteres representa 3 bytes de datos de entrada. De alguna manera, los datos de estado de la vista se devuelven por ASP.NET está dañado - la longitud no es un múltiplo de 4.

¿Registra el agente de usuario cuando esto ocurre? Me pregunto si es un navegador de mal comportamiento en algún lugar... otra posibilidad es que hay un proxy haciendo cosas malas. Del mismo modo, intente registrar la longitud del contenido de la solicitud, para que pueda ver si solo sucede para solicitudes grandes.

 21
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-13 16:04:54
int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');

Donde qs es cualquier cadena codificada en base64

 10
Author: Bhuvana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-18 22:48:43

Prueba esto:

public string EncodeBase64(string data)
{
    string s = data.Trim().Replace(" ", "+");
    if (s.Length % 4 > 0)
        s = s.PadRight(s.Length + 4 - s.Length % 4, '=');
    return Encoding.UTF8.GetString(Convert.FromBase64String(s));
}
 9
Author: Petr Voborník,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-15 21:17:11

Como otros han mencionado, esto puede ser causado cuando algunos firewalls y proxies impiden el acceso a páginas que contienen una gran cantidad de datos de ViewState.

ASP.NET 2.0 introdujo el mecanismo ViewState Chunking que divide el ViewState en trozos manejables, permitiendo que el ViewState pase a través del proxy / firewall sin problemas.

Para habilitar esta función, simplemente agregue la siguiente línea a su web.archivo de configuración.

<pages maxPageStateFieldLength="4000">

Esto debería no se se utiliza como una alternativa para reducir el tamaño de ViewState, pero puede ser un respaldo efectivo contra el error" Longitud no válida para una matriz de caracteres Base-64 " resultante de proxies agresivos y similares.

 8
Author: Red Taz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:32

Esta no es una respuesta, tristemente. Después de encontrarme con el error intermitente durante algún tiempo y finalmente estar lo suficientemente molesto como para tratar de solucionarlo, todavía tengo que encontrar una solución. Sin embargo, he determinado una receta para reproducir mi problema, que podría ayudar a otros.

En mi caso, es SOLO un problema de localhost, en mi máquina de desarrollo que también tiene la base de datos de la aplicación. Es una aplicación. NET 2.0 que estoy editando con VS2005. La máquina Win7 de 64 bits también tiene VS2008 y. NET 3.5 instalados.

Esto es lo que hará generar el error, a partir de una variedad de formas:

  1. Cargue una copia nueva del formulario.
  2. Ingrese algunos datos, y/o postback con cualquiera de los controles del formulario. Mientras no haya un retraso significativo, repita todo lo que quiera y no se produzcan errores.
  3. Espere un poco (1 o 2 minutos tal vez, no más de 5), e intente otro postback.

Un minuto o dos de retraso "esperando localhost " y luego" La conexión se restableció " por el navegador, y global.asax's error de aplicación registros de trampas:

Application_Error event: Invalid length for a Base-64 char array.
Stack Trace:
     at System.Convert.FromBase64String(String s)
     at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
     at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
     at System.Web.UI.HiddenFieldPageStatePersister.Load()

En este caso, no es el TAMAÑO de viewstate, sino algo que tiene que ver con el almacenamiento en caché de page y/o viewstate lo que parece estar molestándome. Establecer <pages> parámetros enableEventValidation="false", y viewStateEncryption="Never" en el Web.config no cambió el comportamiento. Tampoco lo hizo establecer el maxPageStateFieldLength a algo modesto.

 1
Author: fortboise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-07 16:22:58

Eche un vistazo a sus HttpHandlers. He estado notando algunos errores extraños y completamente aleatorios en los últimos meses después de implementar una herramienta de compresión (RadCompression de Telerik). Estaba notando errores como:

  • Sistema.Web.HttpException: No se pueden validar los datos.

  • Sistema.Web.HttpException: El cliente desconectado.---> Sistema.Web.UI.ViewStateException: Estado de vista no válido.

Y

  • Sistema.FormatException: Longitud no válida para una matriz de caracteres Base-64.

  • Sistema.Web.HttpException: El cliente desconectado. ---> Sistema.Web.UI.ViewStateException: Estado de vista no válido.

Yo escribí sobre esto en mi blog.

 1
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 15:43:26

Esto se debe a un estado de vista enorme, en mi caso tuve suerte ya que no estaba usando el estado de vista. Acabo de agregar enableviewstate="false" en la etiqueta del formulario y el estado de la vista pasó de 35k a 100 caracteres

 0
Author: coderman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-01 09:37:01

Durante la prueba inicial para la membresía.ValidateUser con un SqlMembershipProvider, utilizo un algoritmo hash (SHA1) combinado con una salt, y, si cambié la longitud de la sal a una longitud no divisible por cuatro, recibí este error.

No he probado ninguna de las correcciones anteriores, pero si la sal está siendo alterada, esto puede ayudar a alguien a identificar que como la fuente de este error en particular.

 0
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-19 15:55:50

Como dijo Jon Skeet, la cadena debe ser múltiple de 4 bytes. Pero todavía estaba recibiendo el error.

Al menos se eliminó en modo de depuración. Ponga un punto de interrupción en Convert.FromBase64String() y luego paso a través del código. Milagrosamente, el error desapareció para mí:) Probablemente está relacionado con los estados de vista y otros problemas similares como otros han informado.

 0
Author: Hammad Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-26 16:30:03

Además de la solución de@jalchr que me ayudó, descubrí que al llamar a ATL::Base64Encode desde una aplicación c++ para codificar el contenido que pasa a un ASP.NET webservice, también necesitas algo más. Además de

sEncryptedString = sEncryptedString.Replace(' ', '+'); 

De la solución de @jalchr, usted también necesita asegurarse de que no use el ATL_BASE64_FLAG_NOPAD bandera en ATL::Base64Encode:

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
 0
Author: nspire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 15:37:36