Tenho muito pouco para continuar aqui. Não consigo reproduzir isso localmente, mas quando os usuários recebem o erro, recebo uma notificação automática de exceção por e-mail:
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()
Estou inclinado a pensar que há um problema com os dados atribuídos ao viewstate. Por exemplo:
List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;
É difícil adivinhar a origem do erro sem ser capaz de reproduzi-lo localmente.
Se alguém já teve alguma experiência com esse erro, eu gostaria muito de saber o que você descobriu.
Depois que urlDecode processa o texto, ele substitui todos os caracteres '+' por '' ... portanto, o erro. Você deve simplesmente chamar esta instrução para torná-la compatível com a base 64 novamente:
fonte
+
consertou. Herói!Meu palpite é que algo está codificando ou decodificando com muita frequência - ou que você tem texto com várias linhas.
As strings de Base64 devem ter um comprimento múltiplo de 4 caracteres - cada 4 caracteres representa 3 bytes de dados de entrada. De alguma forma, os dados do estado de exibição transmitidos pelo ASP.NET estão corrompidos - o comprimento não é múltiplo de 4.
Você registra o agente do usuário quando isso ocorre? Eu me pergunto se é um navegador mal-comportado em algum lugar ... outra possibilidade é que haja um proxy fazendo coisas impertinentes. Da mesma forma, tente registrar o comprimento do conteúdo da solicitação, para que você possa ver se isso acontece apenas para solicitações grandes.
fonte
Experimente isto:
fonte
onde
qs
está qualquer string codificada em base64fonte
Como outros mencionaram, isso pode ser causado quando alguns firewalls e proxies impedem o acesso a páginas que contêm uma grande quantidade de dados ViewState.
ASP.NET 2.0 introduziu o mecanismo ViewState Chunking que divide o ViewState em pedaços gerenciáveis, permitindo que o ViewState passe pelo proxy / firewall sem problemas.
Para ativar esse recurso, basta adicionar a seguinte linha ao seu arquivo web.config.
Isso não deve ser usado como uma alternativa para reduzir o tamanho do ViewState, mas pode ser um contra-ataque eficaz contra o erro "Comprimento inválido para uma matriz de caracteres de Base-64" resultante de proxies agressivos e semelhantes.
fonte
Isso não é uma resposta, infelizmente. Depois de encontrar o erro intermitente por algum tempo e, finalmente, ficar irritado o suficiente para tentar consertá-lo, ainda não encontrei uma solução. Porém, determinei uma receita para reproduzir meu problema, que pode ajudar outras pessoas.
No meu caso, é APENAS um problema de localhost, na minha máquina de desenvolvimento que também tem o banco de dados do aplicativo. É um aplicativo .NET 2.0 que estou editando com o VS2005. A máquina Win7 de 64 bits também possui VS2008 e .NET 3.5 instalados.
Aqui está o que irá gerar o erro, em uma variedade de formulários:
Um ou dois minutos de atraso "esperando pelo host local" e depois "A conexão foi redefinida" pelo navegador e
global.asax
os logs de trap de erro do aplicativo:Nesse caso, não é o SIZE do viewstate, mas algo a ver com o cache de página e / ou viewstate que parece estar me incomodando. Definir
<pages>
parâmetrosenableEventValidation="false"
, eviewStateEncryption="Never"
naWeb.config
não alterar o comportamento. Nem definir omaxPageStateFieldLength
para algo modesto.fonte
Dê uma olhada em seus HttpHandlers. Tenho notado alguns erros estranhos e completamente aleatórios nos últimos meses depois que implementei uma ferramenta de compressão (RadCompression da Telerik). Eu estava percebendo erros como:
System.Web.HttpException: Não é possível validar os dados.
System.Web.HttpException: O cliente desconectou .---> System.Web.UI.ViewStateException: viewstate inválido.
e
System.FormatException: comprimento inválido para uma matriz de caracteres de Base-64.
System.Web.HttpException: O cliente desconectou. ---> System.Web.UI.ViewStateException: viewstate inválido.
Eu escrevi sobre isso no meu blog.
fonte
Isso se deve a um estado de exibição enorme. No meu caso, tive sorte, pois não estava usando o estado de exibição. Acabei de adicionar
enableviewstate="false"
a tag do formulário e o estado de exibição passou de 35k para 100 caracteresfonte
Durante o teste inicial para Membership.ValidateUser com um SqlMembershipProvider, eu uso um algoritmo hash (SHA1) combinado com um salt e, se eu alterasse o comprimento do salt para um comprimento não divisível por quatro, recebi este erro.
Não tentei nenhuma das correções acima, mas se o sal estiver sendo alterado, isso pode ajudar alguém a identificar isso como a origem desse erro específico.
fonte
Como disse Jon Skeet, a string deve ser múltipla de 4 bytes. Mas ainda estava recebendo o erro.
Pelo menos ele foi removido no modo de depuração. Coloque um ponto de interrupção e, em
Convert.FromBase64String()
seguida, percorra o código. Milagrosamente, o erro desapareceu para mim :) Ele provavelmente está relacionado aos estados de exibição e outros problemas semelhantes, conforme outros relataram.fonte
Além da solução de @jalchr que me ajudou, descobri que, ao chamar
ATL::Base64Encode
de um aplicativo C ++ para codificar o conteúdo que você passa para um serviço da Web ASP.NET, você precisa de algo mais também. Além deda solução de @jalchr, você também precisa garantir que não use o
ATL_BASE64_FLAG_NOPAD
sinalizador emATL::Base64Encode
:fonte