Quando un ASP.NET System.Web.HttpResponse.End () viene chiamato, il thread corrente viene interrotta?

StackOverflow https://stackoverflow.com/questions/365249

Domanda

quando uno System.Web.HttpResponse.End () viene chiamato uno System.Thread.Abort viene licenziato, che sto cercando di indovinare è (o incendi) un'eccezione? Ho un po 'di registrazione e questo è stato elencato nel file di registro ...

Una prima occasione

exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
12/14/2008 01:09:31::
Error in Path :/authenticate
Raw Url :/authenticate
Message :Thread was being aborted.
Source :mscorlib
Stack Trace :   at System.Threading.Thread.AbortInternal()
   at System.Threading.Thread.Abort(Object stateInfo)
   at System.Web.HttpResponse.End()
   at DotNetOpenId.Response.Send()
   at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider()
   at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\Services\Authentication\OpenIdAuthenticationService.cs:line 108
   at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\MVC Application\Controllers\AuthenticationController.cs:line 69
TargetSite :Void AbortInternal()
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL
An exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL but was not handled in user code

E 'questo un comportamento normale ed è possibile abortire con grazia, invece di (quello che sembra) un tratto di interruzione brusca?

Aggiornamento

Finora il censimento del comune che è by design . Quindi mi chiedo se è possibile potremmo prendere questa domanda e vedere se potevamo modificare il codice per renderlo si sente come stiamo finendo il filo prematuramente e con grazia uscire ... possibile? Esempi di codice?

È stato utile?

Soluzione

Sì, questo è davvero di progettazione. Microsoft ha anche documentato esso. In quale altro modo si potrebbe fermare il resto del programma dall'esecuzione?

Altri suggerimenti

Non v'è alcuna cosa come un "grazioso" abortire. Si potrebbe semplicemente Flush () la risposta, però, invece di porvi fine e lasciare che il quadro prendersi cura di chiudere la connessione per voi. Sto assumendo in questo caso che si desidera che la risposta inviata al client, vale a dire, il caso tipico.

MSDN , chiamando Response .End () genera il ThreadAbortException quando la risposta si conclude prematuramente. È davvero necessario chiamare Response.End () solo quando si desidera l'eccezione sollevata.

Non c'è niente di intrinsecamente sgraziato su un'eccezione recursing il tuo stack per fermare l'esecuzione corrente. Certamente non più di quanto si un'eccezione e la cattura ad un certo posto in basso nella vostra eccezione.

mi piacerebbe guardare a filtrare dalla tua registrazione. Se si utilizza la salute ASP.Net monitoraggio è possibile configurare / mappare ogni eccezione a un determinato fornitore (log degli eventi, la posta, ecc) per controllare se si ottiene una notifica per threadabort eccezioni o meno. Se si tratta di registrazione personalizzato poi Avevo solo aggiungere un caso per verificare la presenza di esso.

Si noti che non si può mangiare un ThreadAbortException quindi, anche se il codice di registrazione sta facendo qualcosa di simile catch(Exception e) { // log exception and then do not throw again } il ThreadAbortException sarà ancora essere sollevato ancora una volta dal quadro una volta il vostro fermo uscite dei blocchi.

Non utilizzare il metodo Response.End () perché utilizza Application.End () e interrompere l'applicazione. Ulteriore richiesta di utilizzo HTTP o risposta violare Pagina del ciclo di vita. Utilizzare HttpContext.Current.Response.Close () o HttpContext.Current.ApplicationInstance.CompleteRequest ();

Ho usato tutte le modifiche di cui sopra, ma ancora mi è stato sempre lo stesso problema sul mio applicazione Web.

Poi ho contattato il mio hosting forniscono & chiesto loro di verificare se qualsiasi software antivirus o di blocco i nostri file da trasferire via HTTP. o ISP / rete non sta permettendo file da trasferire.

Hanno controllato le impostazioni del server e di bypass del "Data Center Firewall condivise" per il mio assistente e ora la nostra applicazione ha iniziato a scaricare il file.

Spero che questa risposta vi aiuterà someone.This è ciò che ha funzionato per me

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top