when a System.Web.HttpResponse.End() is called a System.Thread.Abort is being fired, which i’m guessing is (or fires) an exception? I’ve got some logging and this is being listed in the log file…
A first chance
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:UsersPure KromeDocumentsVisual Studio 2008ProjectsMyProjectProjectsServicesAuthenticationOpenIdAuthenticationService.cs:line 108 at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:UsersPure KromeDocumentsVisual Studio 2008ProjectsMyProjectProjectsMVC ApplicationControllersAuthenticationController.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
Is this normal behavior and is it possible to gracefully abort instead of (what looks like) a sudden abrupt abort?
Update
So far it the common census that it’s by design. So i’m wondering if it’s possible we could take this question and see if we could tweak the code to make it not feel like we’re ending the thread prematurely and gracefully exit … Possible? Code examples?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
There is no such thing as a “graceful” abort. You could simply Flush() the response, though, instead of ending it and let the framework take care of closing the connection for you. I’m assuming in this case that you want the response sent to the client, i.e., the typical case.
According to MSDN, calling Response.End() throws the ThreadAbortException when the response ends prematurely. You really should only call Response.End() when you want the exception raised.
Method 2
Yes, this is indeed by design. Microsoft has even documented it. How else would you stop the rest of your program from execution?
Method 3
There’s nothing inherently ungraceful about an exception recursing up your stack to stop the current execution. Certainly no more than you throwing an exception and catching it at some lower place in your exception.
I’d look at filtering it from your logging. If you’re using the ASP.Net health monitoring you can configure/map each exception to a given provider (event log, mail, etc) to control whether you get a notification for threadabort exceptions or not. If it’s custom logging then I’d just add an if to check for it.
Note that you can’t eat a ThreadAbortException so even if your logging code is doing something like catch(Exception e) { // log exception and then do not throw again } the ThreadAbortException will still be raised again by the framework once your catch block exits.
Method 4
Don’t use Response.End() method because it uses Application.End() and stop the application. Further use HTTP request or response violating Page Life Cycle. Use HttpContext.Current.Response.Close() or HttpContext.Current.ApplicationInstance.CompleteRequest();
Method 5
I used all above changes but still I was getting same issue on my web application.
Then I contacted my hosting provide & asked them to check if any software or antivirus blocking our files to transfer via HTTP. or ISP/network is not allowing file to transfer.
They checked server settings & bypass the “Data Center Shared Firewall” for my server & now our application started to download the file.
Hope this answer will help someone.This is what worked for me
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0