Artigo: 917069 - Última revisão: quarta-feira, 5 de Dezembro de 2007 - Revisão: 3.3

Uma aplicação do ASP.NET pode ocorrer atrasos, se um pedido expirar quando a aplicação chama componentes COM + em processo

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Considere o seguinte cenário. Uma aplicação do Microsoft ASP.NET invoca componentes Microsoft COM + em processo. O pedido de tempo limite de momento preciso à medida que determinadas operações ocorrem num componente COM +. Neste cenário, tempo de execução + poderá indicar uma falha ao subsistema de relato de erros do Windows. Em seguida, a funcionalidade Relato de erros do Windows pode demorar acções que podem causar atrasos adicionais na aplicação e composto o problema subjacente. Quando visualiza o registo do sistema no Visualizador de eventos, poderá notar um evento semelhante à seguinte:

ID de evento COM +: 4768
Tipo de evento: erro
Origem do evento: +
Categoria do evento: Evento desconhecido
ID: 4786
Descrição: O sistema chamou um componente personalizado e esse componente tem falha e gerou uma excepção. Isto indica um problema com o componente personalizado. Notifique o programador deste componente que ocorreu uma falha e fornecer-lhes as informações abaixo.
Nome do método: IObjectControl::Deactivate()
Excepção: E0434F4D
Endereço: 0x77E649D3
Chamar pilha:
Kernel32! RaiseException + 0x48
mscorsvr! CoEEShutDownCOM + 0xe448
mscorsvr! CoEEShutDownCOM + 0xe3cb
mscorsvr! CoEEShutDownCOM + 0xe37f
mscorsvr! CoEEShutDownCOM + 0xe322
mscorsvr! GetMetaDataPublicInterfaceFromInternal + 0x26ef
mscorsvr! CoEEShutDownCOM + 0x15eae
mscorsvr! ReleaseFusionInterfaces + 0x1d2fa
Comsvcs! RegisterComEvents + 0x3f074
Comsvcs! RegisterComEvents + 0x40146
Ole32! ReadStringStream + 0x22057
Ole32! CreateDataAdviseHolder + 0x1534
Ole32! CoQueryAuthenticationServices + 0xf5f
Ole32! CoQueryAuthenticationServices + 0x1b06
Ole32! CoQueryAuthenticationServices + 0x2236
Tipo de evento: erro
Origem do evento: Erro de aplicação
Categoria do evento: (100)
ID do evento: 1000
Descrição: Em falha aplicação w3wp.exe, versão 6.0.3790.1830, módulo kernel32.dll, versão 5.2.3790.2756, endereço em falha 0x00015e02 provocar uma falha. Para mais informações, consulte o Centro de ajuda e suporte ' em http://go.Microsoft.com/fwlink/events.asp.
Dados: 0000: 41 70 70 c 6 69 63 61 Applicat 74 0008: 6e 6f 69 20 46 61 da aplicação c 6 69 falha 0010: 75 72 20 65 77 20 77 33 urarem w3w 0018: 70 2e 78 65 20 65 36 2e p.exe 6. 0020: 30 2e 37 33 39 30 2e 31 0.3790.1 0028: 38 33 30 20 69 6e 20 6b 830 k em 0030: 65 72 6e 65 c 6 33 32 2e ernel32. 0038: 64 c 6 6 c 20 35 2e 32 2e dll 5.2. 0040: 33 37 39 30 2e 32 37 3790.275 35 0048: 36 20 61 74 20 6f 66 66 6 em Desactivar 0050: 73 65 74 20 30 30 30 31 conjunto 0001 0058: 35 65 30 32 5e02

Causa

Este problema ocorre quando for excedido o limite de tempo limite para um pedido ASP.NET. Tempo de execução ASP.NET pára o pedido por deitar uma excepção ThreadAbortException para o thread que processa o pedido. Se o pedido ASP.NET invoca um componente COM + em processo, se qualquer um dos métodos IObjectControl do componente estiverem em execução no momento da excepção ThreadAbortException , tempo de execução + irá detectar a excepção e relatório de falha para relatório de erros do Windows. Em seguida, relatório de erros do Windows, pode criar entradas de registo de eventos e comunicar com servidores de relato de erros. Quando este comportamento ocorre, o thread que executa o pedido ASP.NET bloqueará e a resposta está atrasada. Relatório de erros do Windows também podem criar um ficheiro de informação do processo. Quando este comportamento ocorre, o processo fica bloqueado e todas as respostas se atrasem. Processos que hospedem dentro do processo (biblioteca) + aplicações não são terminados quando ocorrem estes erros. Além disso, o ciclo pode repetir durante interrupções subsequentes e provocar atrasos adicionais.

Nota O exemplo na secção "Mais informação" utiliza uma classe de Microsoft .NET Framework ServicedComponent . No entanto, o mesmo problema pode ocorrer se a aplicação utiliza componentes COM + não geridos.

Resolução

Para resolver este problema, evite o limite de tempo ASP.NET. Se os pedidos do ASP.NET não devem exceder o limite de tempo limite, investigar e resolver a origem de atrasos subjacentes. Os seguintes métodos podem ser ferramentas eficazes para descobrir a origem do atraso subjacente:
  • Analise ficheiros de informação do processo efectuadas quando detecta o atraso subjacente.
  • Execute a aplicação num utilitário de gerador de perfis.
  • Utilize o registo em toda a aplicação.
Em alguns cenários, os pedidos devem ser esperados demorar mais tempo do que o limite de pedido de tempo predefinido ASP.NET. Nestes cenários, terá de alterar o valor de limite de tempo para um valor mais apropriado. Para o fazer, utilize um dos seguintes métodos:
  • Utilize a definição executionTimeout .
  • Utilize a propriedade Server.ScriptTimeout .

Como contornar

Para contornar este problema, pode alterar a aplicação do COM + de uma aplicação dentro do processo (biblioteca) para um aplicativo fora de processo (servidor). Numa aplicação de servidor, os componentes do COM + executadas num processo separado de pedidos ASP.NET. Por conseguinte, o runtime do COM + não detecta uma excepção ThreadAbortException e a excepção não é comunicada ao subsistema de relato de erros do Windows.

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Passos para reproduzir o problema

  1. Siga os passos do artigo da base de dados de conhecimento da Microsoft 306296 criar uma classe de ServicedComponent simples e, em seguida, instalar a classe para COM +. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
    306296  (http://support.microsoft.com/kb/306296/ ) Como criar um serviço componente .NET no Visual C# .NET
  2. Adicione o seguinte exemplo de código para o ServicedComponent class.
    protected override void Activate()
    {
    	// Sleep for 100 seconds.
    	// (The default ASP.NET time-out is 90 seconds.)
    	System.Threading.Thread.Sleep(1000*100);
    }
    
  3. Crie uma aplicação Web no Microsoft Visual C#. Para o fazer, siga estes passos:
    1. Inicie o Microsoft Visual Studio NET..
    2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
    3. Na caixa de diálogo Novo projecto , clique em Visual C# Projects em Project Types e, em seguida, clique em ASP.NET Web Application em modelos .
    4. Na caixa localização , escreva http://localhost/TestWeb1 .
    5. Clique em OK para criar o projecto. WebForm1.aspx é adicionado ao projecto.
  4. No Solution Explorer, clique com o botão direito do rato TestWeb1 e, em seguida, clique em Add Reference .
  5. Na caixa de diálogo Adicionar referência do , clique em Procurar .
  6. Na caixa de diálogo Seleccionar componentes , seleccione a DLL que contém o ServicedComponent -derivada classe que gerou no passo 1.
  7. No Solution Explorer, clique com o botão direito do rato em WebForm1.aspx e, em seguida, clique em Código .
  8. Adicione o seguinte exemplo de código para o Page_Load evento procedure.
    // Create an instance of the ServicedComponent-derived class.
    // Note: Change the namespace and the class name as appropriate.
    MyNamespace.MyServicedComponent sc = new MyNamespace.MyServicedComponent();
    
    // Call any method on this object to cause the Activate method to occur.
    sc.DoTrans();
    
  9. Utilize um utilitário de teste de stress para testar a página http://localhost/TestWeb1/WebForm1.aspx. Por exemplo, siga os passos listados no seguinte artigo da base de dados de conhecimento da Microsoft:
    815161  (http://support.microsoft.com/kb/815161/ ) Como medida ASP.NET resposta com a ferramenta Web Application Stress

A informação contida neste artigo aplica-se a:
  • Microsoft COM+ 1.5
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 2.0
Palavras-chave: 
kbmt kbtshoot kbbug kbprb KB917069 KbMtpt
Tradução automáticaTraduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 917069  (http://support.microsoft.com/kb/917069/en-us/ )