PROBLEMA: Mensagem de erro System.Threading.ThreadAbortException ao usar Server.Transfer em HTTPHandler em um aplicativo ASP.NET

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: 817266
Sintomas
Quando você usa um método de Server.Transfer em HTTPHandler para transferir o controle de uma página para outra em um aplicativo ASP.NET, você receberá a seguinte mensagem de erro:
System.Threading.ThreadAbortException: Thread estava sendo anulado. em System.Threading.Thread.AbortInternal() no System.Threading.Thread.Abort() no System.Threading.Thread.Abort(Object stateInfo) no System.Web.HttpResponse.End() no System.Web.HttpServerUtility.Transfer (caminho de String, Boolean preserveForm)
Causa
Quando você chamar o Server.Transfer , ASP.NET internamente chama o método de Server.Execute para transferir o controle e chama o método Response.End para finalizar o processamento da página atual. Response.End Finaliza a execução da página e chama o método thread.Abort . O método thread.Abort faz com que a mensagem de erro ThreadAbortException seja exibida.
Como Contornar
Para contornar esse problema, use Server.Execute em vez de Server.Transfer no método ProcessRequest de HTTPHandler . O método ProcessRequest modificado é da seguinte maneira:

código de exemplo do Visual translation from VPE for Csharp .NET
public void ProcessRequest(HttpContext context)       {         try         {                        context.Server.Execute("WebForm1.aspx");         }         catch(System.Exception e)         {            context.Response.Write(e.StackTrace);            context.Response.Write(e.ToString());         }      }
código de exemplo do Visual Basic .NET
Public Sub ProcessRequest(ByVal context As HttpContext) _       Implements IHttpHandler.ProcessRequest      Try                 context.Server.Execute("WebForm1.aspx")      Catch e As Exception         context.Response.Write(e.StackTrace)      End TryEnd Sub
Situação
Esse comportamento é por design.
Mais Informações

Passos para reproduzir o problema

  1. No Microsoft Visual Studio. NET, use o Visual Basic .NET ou Visual translation from VPE for Csharp .NET para criar um novo ASP.NET Application projeto. Por padrão, WebForm1.aspx é criado. Nomeie o projeto ServerTransferTest .
  2. Clique com o botão direito do mouse em WebForm1.aspx e clique em Exibir código fonte HTML .
  3. Substitua o código existente com o seguinte código de exemplo:
    <%@ Page %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML>   <HEAD>      <title>WebForm1</title>         </HEAD>   <body MS_POSITIONING="GridLayout">      <form id="Form1" method="post" runat="server">         <asp:HyperLink id="HyperLink1" style="Z-INDEX: 101; LEFT: 324px; POSITION: absolute; TOP: 181px" runat="server" NavigateUrl="http://localhost/ServerTransferTest/test.ashx">http://localhost/ServerTransferTest/test.ashx</asp:HyperLink>         <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 292px; POSITION: absolute; TOP: 149px" runat="server">On Clicking this URL should not throw any exception</asp:Label>      </form>   </body></HTML>
  4. Clique duas vezes o Modo de design de WebForm1.aspx e, em seguida, substitua o código existente no code-behind página com o código de exemplo a seguir:

    código de exemplo do Visual translation from VPE for Csharp .NET
    using System;using System.Web;using System.Web.UI.WebControls;namespace ServerTransferTest{	/// <summary>	/// Summary description for WebForm1.	/// </summary>	public class WebForm1 : System.Web.UI.Page   {      protected System.Web.UI.WebControls.Label Label1;      protected System.Web.UI.WebControls.HyperLink HyperLink1;		private void Page_Load(object sender, System.EventArgs e)		{        		}		#region Web Form Designer generated code		override protected void OnInit(EventArgs e)		{			//			// CODEGEN: ASP.NET Web Form Designer requires this call.			//			InitializeComponent();			base.OnInit(e);		}				/// <summary>		/// Required method for Designer support - do not modify		/// the contents of this method by using the code editor.		/// </summary>		  private void InitializeComponent()		  {  		   this.Load += new System.EventHandler(this.Page_Load);		  }		#endregion	}}

    código de exemplo do Visual Basic .NET
    Public Class WebForm1   Inherits System.Web.UI.Page   Protected WithEvents Label1 As System.Web.UI.WebControls.Label   Protected WithEvents HyperLink1 As System.Web.UI.WebControls.HyperLink#Region " Web Form Designer Generated Code "   'Web Form Designer requires this call.   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()   End Sub   Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init      'CODEGEN: Web Form Designer requires this method call.       'Do not modify it by using the code editor.      InitializeComponent()   End Sub#End Region   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load      'Put user code to initialize the page here   End SubEnd Class
  5. No menu arquivo , clique em Add New Item .
  6. Em Add New Item , clique em Class . Na caixa de texto nome , em Add New Item , renomeie a classe HelloWorldHandler e, em seguida, clique em Abrir .
  7. Substitua o código existente no arquivo de classe HelloWorldHandler com o código de exemplo a seguir:

    código de exemplo do Visual translation from VPE for Csharp .NET
    using System.Web;namespace ServerTransferTest{   public class HelloWorldHandler : IHttpHandler    {      public void ProcessRequest(HttpContext context)       {         try         {            context.Server.Transfer("WebForm1.aspx", true ) ;                     }         catch(System.Exception e)         {            context.Response.Write(e.StackTrace);            context.Response.Write(e.ToString());         }      }      public bool IsReusable       {         // To enable pooling, return true here.         // This keeps the handler in memory.         get { return false; }      }   }}
    Código de exemplo do Visual Basic .NET
    Imports SystemImports System.WebPublic Class HelloWorldHandler   Implements IHttpHandler   Public Sub ProcessRequest(ByVal context As HttpContext) _       Implements IHttpHandler.ProcessRequest      Try         ' context.Server.Transfer("WebForm1.aspx", True)         context.Server.Execute("WebForm1.aspx")      Catch e As Exception         context.Response.Write(e.StackTrace)      End Try   End Sub   ' Override the IsReusable property.           Public ReadOnly Property IsReusable() As Boolean _   Implements IHttpHandler.IsReusable      Get         Return True      End Get   End PropertyEnd Class
  8. Repita as etapas 5 e 6 para adicionar outro arquivo de classe. Renomeie o arquivo de classe HelloWorldHandlerFactory .
  9. Substitua o código existente no arquivo de classe HelloWorldHandlerFactory com o código de exemplo a seguir:

    código de exemplo do Visual translation from VPE for Csharp .NET usando
    using System.Web;namespace ServerTransferTest{   public class HelloWorldHandlerFactory : IHttpHandlerFactory   {      public IHttpHandler GetHandler( HttpContext context, System.String requestType, System.String url, System.String pathTranslated)      {         HttpResponse Response = context.Response;         Response.Write("<html>");         Response.Write("<body>");         Response.Write("<h1> Hello from HelloWorldHandlerFactory.GetHandler </h1>");         Response.Write("</body>");         Response.Write("</html>");         return new HelloWorldHandler();      }      public void ReleaseHandler( IHttpHandler handler )      {      }   }}
    Código de exemplo do Visual Basic .NET
    Imports SystemImports System.WebPublic Class HelloWorldHandlerFactory   Implements IHttpHandlerFactory   Public Overridable Function GetHandler(ByVal context As HttpContext, _   ByVal requestType As String, ByVal url As String, ByVal pathTranslated As String) _        As IHttpHandler _        Implements IHttpHandlerFactory.GetHandler      Dim Response As HttpResponse = context.Response      Response.Write("<html>")      Response.Write("<body>")      Response.Write("<h1> Hello from HelloWorldHandlerFactory.GetHandler </h1>")      Response.Write("</body>")      Response.Write("</html>")      Return New HelloWorldHandler()   End Function   Public Overridable Sub ReleaseHandler(ByVal handler As IHttpHandler) _       Implements IHttpHandlerFactory.ReleaseHandler   End SubEnd Class
  10. Abra o arquivo Web.config e adicione a seção httpHandlers na seção System.Web da seguinte maneira:
    <configuration>   <system.web>   <httpHandlers>     <add verb="*" path="*.ashx" type="ServerTransferTest.HelloWorldHandlerFactory,ServerTransferTest" />   </httpHandlers>..........</system.web></configuration>   
  11. No menu Debug , clique em Iniciar e, em seguida, clique no hiperlink seguinte em WebForm1.aspx:
    http://localhost/ServerTransferTest/Test.ashx
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
312629PROBLEMA: ThreadAbortException ocorre se você usar Response.end, Response.Redirect ou Server.Transfer
320439PROBLEMA: Mensagem de erro "Erro de solicitação filho em execução" ao usar Server.Transfer ou Server.Execute na página ASP.NET
224363Usando o método de Server.Execute

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 817266 - Última Revisão: 05/05/2003 18:46:00 - Revisão: 1.3

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbmt kberrmsg kbthread kbwebforms kbconfig kbprb KB817266 KbMtpt
Comentários