Você está offline; aguardando reconexão

Como solucionar o erro "o estado de exibição é inválido" com o ASP.NET

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 829743
Sumário
Este artigo descreve algumas técnicas que podem ser usadas para depurar e resolver problemas com o estado de exibição em aplicativos Microsoft ASP.NET.
INTRODUÇÃO
Estado de exibição é um recurso do ASP.NET que permite que as páginas preservem automaticamente seu estado sem depender do estado do servidor (por exemplo, o estado da sessão). No entanto, problemas relacionados com o estado de exibição podem ser difíceis de depurar. Na maioria dos casos, quando ocorrem problemas com o estado de exibição, você recebe a seguinte mensagem de erro no navegador da Web, com pouca indicação de que pode estar causando o problema:
"O viewstate é inválido para esta página e pode estar corrompido"
Este artigo descreve algumas técnicas que podem ser usadas para depuração e para resolver problemas com o estado de exibição.
Mais Informações

Verifique se você não estiver executando em problemas que foram corrigidos

Inúmeros problemas foram corrigidos com ASP.NET 1.0 hotfixes e service packs e as correções do estado de exibição também fazem parte do ASP.NET 1.1. Certifique-se de que você aplicou as correções mais recentes antes de controlar os problemas já foram resolvidos. Você pode obter as atualizações mais recentes do Microsoft.NET Framework a partir do seguinte site do Microsoft Developer Network (MSDN):

Definir o atributo validationKey se você estiver executando em um Web farm

Em um Web farm, cada solicitação de cliente pode ir para uma máquina diferente em cada postagem. Devido a esse comportamento, você não pode deixar o atributo validationKey definido para Gerar o arquivo Machine. config. Em vez disso, você deve definir o valor do atributo validationKey para uma cadeia fixada é compartilhada por todos os computadores em um Web farm.

Para obter mais informações sobre este problema, clique no número abaixo para ler o artigo na Base de dados de Conhecimento Microsoft:
323744 CORREÇÃO: mensagem de erro "viewstate é inválido para esta página e pode estar corrompido" no ASP.NET

Não armazenar tipos gerados dinamicamente em estado de exibição em um Web farm

Quando o ASP.NET compila dinamicamente os arquivos, os arquivos são compilados em assemblies com essencialmente nomes aleatórios (por exemplo, um nome de arquivo pode ser jp395dun.dll). Se você estiver executando um Web farm, os mesmos arquivos serão compilados em assemblies com nomes aleatórios diferentes. Normalmente, isso não é um problema porque ninguém faz suposições sobre os nomes de assembly. Mas se você nunca colocar um tipo compilado dinamicamente em estado de exibição usando serialização binária, o nome do assembly será incluído como parte dos dados de estado de exibição. Quando que exibir estado é posteriormente enviado para um servidor diferente do Web farm, o estado de exibição não pode ser desserializado porque ele usa nomes assembly diferente.

A melhor correção para esse problema é evitar o uso de serialização binária. Serialização em binário usa muitos recursos, mesmo quando você não se deparar com este problema. Em vez disso, limite o que você colocar no modo de exibição de estado para uma combinação de Arrays, pares, conjuntose tipos simples (por exemplo, cadeias de caracteres, inte outros tipos). System.Web.UI.Pair e System.Web.UI.Triplet são tipos de invólucro simples que o mecanismo de estado de exibição pode processar com eficiência.

Uma correção alternativa para evitar esse problema é mover os tipos que você está armazenando no modo de exibição estado em um conjunto previamente compilado, na pasta Bin ou no Cache Global de assemblies. Esta correção não trata de desempenho, mas garante que o assembly tem o mesmo nome em todos os computadores.

Observação: Se você armazenar tipos de dados complexos em estado de exibição e enfrenta esse problema, as informações de pilha de chamada irá conter pilhas são semelhantes à seguinte:
[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) +0System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +72System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +58System.Type.GetType(String typeName, Boolean throwOnError) +57System.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 se o problema está relacionado ao recurso de MAC do estado de exibição

A finalidade do recurso de código (MAC) de autenticação do modo estado máquina é tornar impossível para os clientes enviem uma solicitação que contém um estado de exibição mal-intencionado. Por padrão, esse recurso está ativado no seguinte sinalizador no arquivo Machine. config.
enableViewStateMac="true"
A maneira mais simples de determinar se o problema que você está lidando com está relacionado ao recurso MAC é desativar o recurso. Para fazer isso, altere o sinalizador no arquivo Machine. config para o código a seguir.
enableViewStateMac="false"
Se você não recebe mais erros de estado de exibição, o problema está relacionado ao recurso de MAC.

Importante: Desative apenas o recurso do MAC do estado de exibição para ajudar a diagnosticar o problema. Você não deve manter o estado de exibição MAC desativado como solução alternativa para o problema. Nesse caso, você pode introduzir brechas de segurança. Para obter mais informações, visite o seguinte site da MSDN:Se você desativar o recurso de MAC do estado de exibição e, em seguida, usar estado de exibição para controles que não HTML codificar (por exemplo, um controle de rótulo ), os invasores podem violar os dados de estado de exibição e podem colocar dados arbitrários em estado de exibição. Esses dados arbitrários são decodificados e são usados pelos controles ao processar a página lançada. Como resultado, os invasores podem injetar script no aplicativo, a menos que você trabalha para evitar o ataque. Por exemplo, um invasor pode decodificar os dados, injetar script os dados onde é um controle Label e vincule a ele de um site. Qualquer pessoa que clica no link poderia ser vítima de um ataque de injeção de script que poderia potencialmente roubar seus cookies de autenticação ou a identificação da sessão. O script pode também permitir que um invasor alterar os dados de estado para controles que usam estado de exibição e ataques específicos de aplicativo podem ocorrer como resultado.

Em geral, a Microsoft recomenda que você não desativar o estado de exibição MAC de recursos, a menos que tiver certeza absoluta de que você tenha qualquer estado de exibição desabilitado para todos os controles que não HTML codificar sua saída (por exemplo, controles DataGrid , DataList controles, controles Label e outros controles) ou que você está sempre explicitamente definindo seus valores em cada solicitação para algo sabe se é seguro.

Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento Microsoft:
316920 Você recebe uma mensagem de erro "o estado de exibição é inválido" ao usar o método Server. Transfer
324488 Estado de formulários de autenticação e o modo de exibição falham intermitentemente sob carga pesada

Determinar exatamente qual exceção ocorre quando você receber a mensagem de erro

Infelizmente, a mensagem de erro de estado de exibição inválido mencionada na seção "Introdução" deste artigo não é muito informativa. A mensagem de erro geralmente é causada por alguma exceção sendo lançada quando o estado de exibição está sendo processado. O problema é que a exceção está sendo consumida e seus detalhes são perdidos na mensagem de erro.

Usando um depurador, você pode determinar a exceção original. Para fazer isso, você deve anexar um depurador ao processo do ASP.NET (Aspnet_wp.exe ou W3wp.exe) e, em seguida, configurá-lo para capturar todas as exceções. Provavelmente, o depurador irá parar em algumas exceções que não são relevantes, mas eventualmente visitas a exceção do estado de exibição e fornecem informações úteis para solução de problemas.

As seguintes etapas são um exemplo que usa o depurador de Runtime (Cordbg.exe).
  1. Em um prompt de comando, execute oiisreset comando para certificar-se de que são fornecidos com o ponto inicial de angood e, em seguida, navegue até uma página no seu site.
  2. Em um prompt de comando, executeCordbg.exe.
  3. No prompt de comando, digite PRO, e então pressione ENTER. Será exibida uma lista de processos gerenciados. Você deve seeeither o processo de Aspnet_wp.exe ou o W3wp.exe. Observe o itsPID.
  4. No prompt, digite umPID Para anexar ao processo.

    Observação: Substituir PID com o PID que wasnoted na etapa 3.
  5. No prompt, digite autoridade de certificação e para tellCordbg.exe para quebrar em todas as exceções e, em seguida, digite gpara permitir que o processo de execução.
  6. Sempre que você obtiver uma exceção, digitew Para ver a pilha. Se a pilha é um modo de exibição stateexception (procure por LoadPageStateFromPersistenceMedium na pilha), copie allthe exceção e as informações de pilha na janela de comandos e, em seguida, savethe informações. Essas informações podem ajudá-lo a entender o problema. Se theexception está relacionado, digite g.
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Base de Conhecimento Microsoft:
831150 A mensagem de erro "Viewstate é inválido para essa página" não fornece informações suficientes para solucionar o problema

Tente armazenar o estado de exibição na sessão

Por padrão, o estado de exibição é recuperado por meio de um<input type="hidden">campo que é enviado ao navegador. O navegador envia, em seguida, o campo de volta para o servidor na próxima solicitação. Em alguns casos, o estado de exibição pode ficar bem grande e ser uma fonte potencial de problemas. Alguns navegadores não podem lidar com tal um campo oculto grande (e solicitação de grande resultante) e os navegadores podem truncar o estado de exibição. Truncar o estado de exibição faz com que uma mensagem de erro "Exibir estado corrompido". Esse comportamento é mais provável de ocorrer nos navegadores mais simples. Por exemplo, esse comportamento pode ocorrer em um navegador em um PDA.

Para determinar se você pode estar executando para esse tipo de problema, tente armazenar o estado de exibição na sessão. O exemplo a seguir demonstra como fazer isso.
<%@ 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> 

A linha de código a seguir só é necessário no ASP.NET 1.0, para contornar um bug. No ASP.NET 1.1, não é necessário.
<input type=hidden name=__VIEWSTATE>

Determine se o problema é causado por reciclagem do processo de trabalho

Considere o seguinte cenário.
  • Você está executando o ASP.NET em serviços de InternetInformation da Microsoft (IIS) 6.0.
  • O pool de aplicativos está em execução em um otherthan de identidade, a conta do sistema Local, a conta Serviço de rede ou um levelaccount-administrativas.
  • O atributo validationKey o <machineKey>elemento é definir toAutoGenerate no arquivo de configuração.</machineKey>
Nesse cenário, o procedimento a seguir causará um erro de estado de exibição ocorrer:
  1. Um usuário navega de uma página.
  2. O processo do operador que hospeda o applicationrecycles do ASP.NET.
  3. O usuário envia de volta a página.
A solução para esse cenário é usar um atributo explícito validationKey no arquivo de configuração. Para obter mais informações sobre como criar uma chave, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento Microsoft:
312906 Como criar chaves usando o Visual C# .NET para uso em autenticação de formulários
313091 Como criar chaves usando o Visual Basic .NET para uso em autenticação de formulários
Referências
Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento Microsoft:
316920 Mensagem de erro "o estado de exibição é inválido" ao usar Server. Transfer
324488 Estado de formulários de autenticação e o modo de exibição falham intermitentemente sob carga pesada
831150 A mensagem de erro "Viewstate é inválido para essa página" não fornece informações suficientes para solucionar o problema
Para obter mais informações, visite os seguintes sites da MSDN:
GAC

Warning: This article has been translated automatically

Propriedades

ID do Artigo: 829743 - Última Revisão: 01/11/2015 12:03:00 - Revisão: 5.0

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbstate kbwebforms kbinfo kbprb kbmt KB829743 KbMtpt
Comentários
>