Um aplicativo ASP.NET pode enfrentar atrasos se uma solicitação expira quando o aplicativo chama componentes COM + em processo

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: 917069
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Considere o seguinte cenário. Um aplicativo Microsoft ASP.NET chama componentes Microsoft COM + no processo. A solicitação expira no momento exato como determinadas operações ocorrem em um componente COM +. Nesse cenário, o tempo de execução COM + pode relatar uma falha para o subsistema Windows de erros. Em seguida, o relatório de erros do Windows pode levar ações que podem causar atrasos adicionais no aplicativo e composto o problema subjacente. Quando você visualizar o log do sistema em Visualizar eventos, você pode observar um evento semelhante ao seguinte:

COM + Event ID: 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 falhou e gerou uma exceção. Isso indica um problema com o componente personalizado. Notifique o desenvolvedor desse componente que ocorreu uma falha e fornecê-las com as informações abaixo.
Nome do método: IObjectControl::Deactivate()
Exceção: E0434F4D
Endereço: 0x77E649D3
Pilha de chamadas:
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 aplicativo
Categoria do evento: (100)
IDENTIFICAÇÃO de evento: 1000
Descrição: Com falha aplicativo w3wp.exe, versão 6.0.3790.1830, módulo kernel32.dll, versão 5.2.3790.2756, falha de endereço 0x00015e02 falha. Para obter 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: 69 6f 6e 20 46 61 69 c 6 íon falha 0010: 75 72 20 65 77 20 77 33 ure 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 no desativado 0050: 73 65 74 20 30 30 30 31 conjunto 0001 0058: 35 65 30 32 5e02

Causa
Esse problema ocorre quando o limite de tempo limite para uma solicitação do ASP.NET for excedido. O runtime do ASP.NET pára a solicitação por gerar uma exceção ThreadAbortException para o segmento que processa a solicitação. Se a solicitação do ASP.NET chama um componente COM + em processo, e se qualquer um dos métodos IObjectControl do componente estiver executando no momento da exceção ThreadAbortException , o tempo de execução COM + será capturar a exceção e informe a falha ao relatório de erros do Windows. Em seguida, relatório de erros do Windows pode criar entradas do log de eventos e se comunicar com servidores de relatório de erros. Quando esse comportamento ocorre, o thread que executa a solicitação do ASP.NET será bloqueado e a resposta está atrasada. Relatório de erros do Windows também podem criar um arquivo de despejo do processo. Quando esse comportamento ocorre, o processo é congelado e todas as respostas estão atrasadas. Processos que hospedam em processo (biblioteca) + aplicativos não são finalizados quando essas falhas ocorrerem. Além disso, o ciclo pode repetir durante tempos limite subseqüente e causar atrasos adicionais.

Observação O exemplo na seção "Mais informações" usa uma classe do Microsoft .NET Framework ServicedComponent . No entanto, o mesmo problema pode ocorrer se o aplicativo usa componentes COM + não gerenciados.
Resolução
Para resolver esse problema, evite o tempo limite de ASP.NET. Se as solicitações do ASP.NET não devem exceder o limite de tempo limite, investigue e resolva a fonte de atrasos subjacentes. Os seguintes métodos podem ser ferramentas eficientes para descobrir a origem do atraso subjacente:
  • Analise arquivos de despejo do processo que foram seguidos quando você enfrentar o atraso subjacente.
  • Execute o aplicativo em um utilitário de gerador de perfil.
  • Use o log em todo o aplicativo.
Em alguns cenários, as solicitações deverão ser esperadas seja maior do que o tempo limite solicitação ASP.NET padrão. Nessas situações, você deve alterar o valor do tempo limite para um valor mais apropriado. Para fazer isso, use um dos seguintes métodos:
  • Use a configuração executionTimeout .
  • Use a propriedade Server.ScriptTimeout .
Como Contornar
Para contornar esse problema, você pode alterar o aplicativo do COM + de um aplicativo em processo (biblioteca) para um aplicativo fora de processo (servidor). Em um aplicativo de servidor, os componentes COM + executados em um processo separado das solicitações do ASP.NET. Portanto, o tempo de execução COM + não detecta uma exceção ThreadAbortException e a exceção não é relatada para o subsistema Windows erros.
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Etapas para reproduzir o problema

  1. Siga as etapas no artigo 306296 para criar uma classe ServicedComponent simples e, em seguida, instalar a classe em COM +. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    306296Como criar um componente de serviço .NET no Visual translation from VPE for Csharp .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 um aplicativo Web no Microsoft Visual translation from VPE for Csharp. Para fazer isso, execute as seguintes etapas:
    1. Inicie o Microsoft Visual Studio NET..
    2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
    3. Na caixa de diálogo New Project , clique em projetos do Visual translation from VPE for Csharp em Tipos de projeto e, em seguida, clique em ASP.NET Web Application em modelos .
    4. Na caixa Location , digite http://localhost/TestWeb1 .
    5. Clique em OK para criar o projeto. WebForm1.aspx é adicionado ao seu projeto.
  4. No Solution Explorer, clique com o botão direito do mouse TestWeb1 e, em seguida, clique em Add Reference .
  5. Na caixa de diálogo Add Reference , clique em Procurar .
  6. Na caixa de diálogo Selecionar componentes , selecione o DLL que contém o ServicedComponent -classe gerado na etapa 1 derivada.
  7. No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em View Code .
  8. Adicione o seguinte exemplo de código para o 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. Use um utilitário de teste de carga para testar a página http://localhost/TestWeb1/WebForm1.aspx. Por exemplo, execute as etapas listadas no seguinte artigo da Base de dados de Conhecimento Microsoft:
    815161Como medir a capacidade de resposta ASP.NET com a ferramenta Web Application Stress

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 917069 - Última Revisão: 12/09/2015 05:16:11 - Revisão: 3.3

Microsoft COM+ 1.5, Microsoft ASP.NET 1.0, Microsoft ASP.NET 1.1, Microsoft ASP.NET 2.0

  • kbnosurvey kbarchive kbmt kbtshoot kbbug kbprb KB917069 KbMtpt
Comentários