Tengo muy poco para continuar 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 qué averiguó.
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 la base 64 nuevamente:
fuente
+
arreglados. ¡Héroe!Supongo que algo se codifica o descodifica con demasiada frecuencia, o que tiene texto con varias líneas.
Las cadenas Base64 deben tener una longitud de 4 caracteres; cada 4 caracteres representa 3 bytes de datos de entrada. De alguna manera, los datos de estado de vista que ASP.NET devuelve están dañados: la longitud no es un múltiplo de 4.
¿Registra el agente de usuario cuando esto ocurre? Me pregunto si es un navegador que se porta mal en alguna parte ... otra posibilidad es que haya un proxy haciendo cosas malas. Del mismo modo, intente registrar la longitud del contenido de la solicitud, para que pueda ver si solo ocurre para solicitudes grandes.
fuente
Prueba esto:
fuente
¿Dónde
qs
está cualquier cadena codificada en base64?fuente
Como han mencionado otros, esto puede deberse a que 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 de fragmentación de ViewState que divide ViewState en partes manejables, lo que permite que ViewState pase a través del proxy / firewall sin problemas.
Para habilitar esta función, simplemente agregue la siguiente línea a su archivo web.config.
Esto no debe usarse como una alternativa para reducir el tamaño de su 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.
fuente
Esta no es una respuesta, lamentablemente. Después de encontrarme con el error intermitente durante algún tiempo y finalmente estar lo suficientemente molesto como para intentar solucionarlo, todavía tengo que encontrar una solución. Sin embargo, he determinado una receta para reproducir mi problema, lo que podría ayudar a otros.
En mi caso, es SOLAMENTE 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 generará el error, a partir de una variedad de formas:
Un minuto o dos de retraso "esperando localhost" y luego "La conexión fue restablecida" por el navegador, y
global.asax
los registros de captura de errores de la aplicación:En este caso, no es el TAMAÑO del estado de la vista, sino algo que tiene que ver con el almacenamiento en caché de la página y / o del estado de la vista lo que parece estar mordiendo. Configuración de
<pages>
parámetrosenableEventValidation="false"
, yviewStateEncryption="Never"
en elWeb.config
no cambió el comportamiento. Tampoco lo hizo establecermaxPageStateFieldLength
algo modesto.fuente
Eche un vistazo a su HttpHandlers. He notado 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:
System.Web.HttpException: no se pueden validar los datos.
System.Web.HttpException: el cliente se desconectó .---> System.Web.UI.ViewStateException: viewstate no válido.
y
System.FormatException: longitud no válida para una matriz de caracteres Base-64.
System.Web.HttpException: el cliente se desconectó. ---> System.Web.UI.ViewStateException: viewstate no válido.
Yo escribí sobre esto en mi blog.
fuente
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"
la etiqueta del formulario y el estado de la vista pasó de 35k a 100 caracteresfuente
Durante la prueba inicial de Membership.ValidateUser con un SqlMembershipProvider, utilizo un algoritmo hash (SHA1) combinado con una sal y, si cambié la longitud de la sal a una longitud no divisible por cuatro, recibí este error.
No probé ninguna de las soluciones anteriores, pero si se modifica la sal, esto puede ayudar a alguien a identificarlo como la fuente de este error en particular.
fuente
Como dijo Jon Skeet, la cadena debe ser múltiplo de 4 bytes. Pero todavía recibía el error.
Al menos se eliminó en modo de depuración. Ponga un punto de interrupción y
Convert.FromBase64String()
luego siga el código. Milagrosamente, el error desapareció para mí :) Probablemente esté relacionado con los estados de Vista y otros problemas similares que otros han informado.fuente
Además de la solución de @ jalchr que me ayudó, descubrí que al llamar
ATL::Base64Encode
desde una aplicación C ++ para codificar el contenido que pasa a un servicio web ASP.NET, también necesita algo más. Además dede solución de @ jalchr, que también necesita asegurarse de que usted no usa la
ATL_BASE64_FLAG_NOPAD
bandera enATL::Base64Encode
:fuente