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

Traduções deste artigo Traduções deste artigo
ID do artigo: 829743 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve algumas técnicas que podem ser usadas para depurar e para resolver problemas com o estado de exibição em aplicativos Microsoft ASP.NET.

INTRODUÇÃO

Estado de exibição é um recurso no ASP.NET que permite que as páginas automaticamente preservar estado sem depender de estado do servidor (por exemplo, o estado da sessão). No entanto, os problemas relacionados ao estado de exibição podem ser difícil 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 pouco indicação de que podem 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 solucionar problemas com o estado de exibição.

Mais Informações

Verifique se você não está executando em problemas foram corrigidos

Um número de estado de exibição problemas foram corrigidos com ASP.NET 1.0 hotfixes e service packs e as correções também fazem parte do ASP.NET 1.1. Certifique-se de que você aplicou as correções mais recentes antes de controlar as questões que já tenham sido resolvidos. Você pode obter as atualizações mais recentes do Microsoft .NET Framework do site do Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa569276.aspx

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

Em um Web farm, cada solicitação de cliente pode ir para um computador diferente em cada postback. Devido a esse comportamento, você não pode deixar o atributo validationKey definido como AutoGenerate no arquivo Machine.config. Em vez disso, você deve definir o valor do atributo validationKey como uma seqüência fixa que é compartilhada por todas as máquinas em Web farm.

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

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

Quando o ASP.NET compila arquivos dinamicamente, os arquivos são compilados em assemblies com nomes aleatórios essencialmente (por exemplo, um nome de arquivo pode ser jp395dun.dll). Se você estiver executando um Web farm, os mesmos arquivos irão ser compilados em assemblies com nomes diferentes aleatórios. 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 a serialização binária, o nome do assembly serão incluído como parte de dados do estado do modo de exibição. Quando que exibir estado é posteriormente enviada para um servidor diferente em 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 binária usa muitos recursos, mesmo quando você não executar para esse problema. Em vez disso, limite o que colocar no modo de exibição estado para uma combinação de matrizes , pares , Triplets e tipos simples (por exemplo, seqüências de caracteres , int e outros tipos). System.Web.UI.Pair e System.Web.UI.Triplet são tipos de invólucro simples que o mecanismo de estado do modo 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 assembly pré-compilado, na pasta bin ou no cache de assembly global. 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ê armazena tipos de dados complexos no estado da exibição e enfrenta esse problema, as informações de pilha de chamada conterá pilhas são semelhantes às seguintes opções:
[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) +0
System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +72
System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +58
System.Type.GetType(String typeName, Boolean throwOnError) +57
System.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 de estado de modo de exibição

O objetivo o recurso de código (MAC) de autenticação do modo de exibição estado máquina é tornar impossível para clientes para enviar 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 para determinar se o problema 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 receber erros de estado do modo de exibição, o problema está relacionado ao recurso MAC.

importante Desative somente o recurso de MAC de estado do modo de exibição para ajudar a diagnosticar o problema. Você não deve manter o estado de exibição MAC desativada para contornar o problema. Em caso afirmativo, você pode introduzir brechas de segurança. Para obter mais informações, visite o seguinte site da MSDN:
http://msdn2.microsoft.com/en-us/library/aa302388.aspx
Se você desativar o recurso de MAC do estado modo de exibição e, em seguida, usar estado de exibição para controles que não o HTML codificar (por exemplo, um controle Label ), os invasores podem violar os dados de estado de exibição e podem colocar dados arbitrários no estado da exibição. Este dados arbitrários são decodificados e, em seguida, usados por controles quando eles processam a página lançada. Como resultado, os invasores podem injetar script o aplicativo, a menos que você trabalhar para impedir que o ataque. Por exemplo, um invasor pode decodificar os dados, injetar script dados um controle Label e vincule a ele de um site da Web. Qualquer pessoa que clicar 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 também pode permitir que um invasor alterar dados de estado para controles que usam estado de exibição e ataques específicos do aplicativo podem ocorrer como resultado.

Em geral, a Microsoft recomenda que você desative não o estado de exibição MAC recurso a menos que você seja completamente certo de que você tenha qualquer estado de exibição desabilitado para todos os controles que não HTML codificar sua saída (por exemplo, DataGrid controles, DataList controles, controles Label e outros controles) ou que você está definindo sempre explicitamente 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 da Microsoft:
316920Você receber uma mensagem de erro "o estado de exibição é inválido" quando você usa o método Server.Transfer
324488Modo de exibição estado falhar intermitentemente sob carga pesada e autenticação de formulários

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

Infelizmente, a mensagem de erro estado de exibição inválido que é mencionada na seção "Introdução" deste artigo não é muito informativa. A mensagem de erro é geralmente causada por alguns 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 ASP.NET processar (Aspnet_wp.exe ou W3wp.exe) e, em seguida, defini-la para capturar todas as exceções. O depurador provavelmente irá parar em algumas exceções que não são relevantes, mas eventualmente será atingido a exceção de estado do modo de exibição e fornecer informações úteis para solução de problemas.

As seguintes etapas são um exemplo que usa o depurador de tempo de execução (Cordbg.exe).
  1. Em um prompt de comando, execute o comando iisreset para Certifique-se são fornecidos com um bom ponto de partida e navegue até uma página em seu site.
  2. Em um prompt de comando, execute cordbg.exe .
  3. No prompt de comando, digite pro e, em seguida, pressione ENTER. Será exibida uma lista dos processos gerenciados. Você verá o processo Aspnet_wp.exe ou o processo W3wp.exe. Anote seu PID.
  4. Prompt, digite uma PID para anexar o processo.

    Observação Substitua PID o PID que foi observado na etapa 3.
  5. Prompt, digite ca e para informar ao Cordbg.exe para quebrar em todas as exceções e, em seguida, digite g para permitir que o processo de executar.
  6. Sempre que você receber uma exceção, digite w para ver a pilha. Se a pilha é uma exceção de estado do modo de exibição (procure por LoadPageStateFromPersistenceMedium na pilha), copie todas as exceções e as informações de pilha da janela de comando e, em seguida, salvar as informações. Essas informações podem ajudar você a entender o problema. Se a exceção não está relacionado, digite g .
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
831150A mensagem de erro "Viewstate é inválido para esta 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 é ultrapassadas round por meio de um < input type = oculta > 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, esse estado de exibição pode ficar bem grande e ser uma fonte potencial de problemas. Alguns navegadores não podem tratar como um campo oculto grande (e a solicitação grande resultante) e os navegadores podem truncar o estado de exibição. Truncar o estado de exibição causa uma mensagem de erro "exibir estado corrompido". Esse comportamento é mais provável de ocorrer em navegadores mais simples. Por exemplo, esse comportamento pode ocorrer em um navegador em um PDA.

Para determinar se você pode estar executando em como um problema, tente armazenar o estado de exibição na sessão. O exemplo a seguir demonstra como fazer this.
<%@ 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ária no ASP.NET 1.0, para solucionar um erro. No ASP.NET 1.1, não é necessário.
<input type=hidden name=__VIEWSTATE>

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

Considere o seguinte cenário.
  • Você está executando ASP.NET no Microsoft Internet Information Services (IIS) 6.0.
  • O pool de aplicativos está em execução sob uma identidade diferente de conta do sistema local, a conta do serviço de rede ou uma conta de nível administrativo.
  • O atributo validationKey do elemento <machinekey> é definido como AutoGenerate no arquivo de configuração.
Nesse cenário, o procedimento a seguir causará um erro de estado de modo de exibição ocorrer:
  1. Um usuário procura uma página.
  2. Recicla o processo de operador que hospeda o aplicativo ASP.NET.
  3. O usuário postada a página.
A solução alternativa para esse cenário é usar um atributo explícita 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 da Microsoft:
312906Como criar chaves usando o Visual translation from VPE for Csharp .NET para uso em autenticação de formulários
313091Como 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 da Microsoft:
316920Mensagem de erro "o estado de exibição é inválido" quando você usa Server.Transfer
324488Modo de exibição estado falhar intermitentemente sob carga pesada e autenticação de formulários
831150A mensagem de erro "Viewstate é inválido para esta página" não fornece informações suficientes para solucionar o problema
Para obter mais informações, visite os seguintes sites da MSDN:
http://msdn2.microsoft.com/en-us/library/aa302388.aspx

http://msdn2.microsoft.com/en-us/netframework/aa731542.aspx

Propriedades

ID do artigo: 829743 - Última revisão: segunda-feira, 18 de junho de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Palavras-chave: 
kbmt kbstate kbwebforms kbinfo kbprb KB829743 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 829743

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com