I've seen several questions regarding this issue but I've not found an apt answer for my issue. Initially I was using the following code after writing json in a function
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.SuppressContent = True;
HttpContext.Current.ApplicationInstance.CompleteRequest();
Was getting Server cannot append header after HTTP headers have been sent
exception.
So I altered the code to
try {
HttpContext.Current.Response.Write(Data);
HttpContext.Current.Response.End();
} catch (System.Threading.ThreadAbortException exc) {
try {
//Sends the response buffer
HttpContext.Current.Response.Flush();
// Prevents any other content from being sent to the browser
HttpContext.Current.Response.SuppressContent = true;
//Directs the thread to finish, bypassing additional processing
HttpContext.Current.ApplicationInstance.CompleteRequest();
} catch (Exception ex) {
//Log Exception
}
}
All these code are in function(lets say) writeData()
and its called by a function called CallWriteData
. Now the exception has been successfully handled in WriteData()
function but its throwing Thread was being aborted
exception in the parent function CallWriteData
.
To be honest its not a major issue in my project but it would be nice if I fix this annoying issue. Also this exception in CallWriteData
not every-time(sometimes its successfully handled).
Finally,this helped me to handle Thread was being aborted
exception,
try
{
//Write HTTP output
HttpContext.Current.Response.Write(Data);
}
catch (Exception exc) {}
finally {
try
{
//stop processing the script and return the current result
HttpContext.Current.Response.End();
}
catch (Exception ex) {}
finally {
//Sends the response buffer
HttpContext.Current.Response.Flush();
// Prevents any other content from being sent to the browser
HttpContext.Current.Response.SuppressContent = true;
//Directs the thread to finish, bypassing additional processing
HttpContext.Current.ApplicationInstance.CompleteRequest();
//Suspends the current thread
Thread.Sleep(1);
}
}
if you use the following the following code instead of HttpContext.Current.Response.End()
, you will get Server cannot append header after HTTP headers have been sent
exception.
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.SuppressContent = True;
HttpContext.Current.ApplicationInstance.CompleteRequest();
Another Fix which I found is Thread.BeginCriticalRegion();
try
{
//Write HTTP output
HttpContext.Current.Response.Write(Data);
} catch (Exception exc) {}
finally {
try {
//Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception might jeopardize other tasks in the application domain.
Thread.BeginCriticalRegion();
HttpContext.Current.Response.End();
} catch (Exception ex) {}
finally {
//Sends the response buffer
HttpContext.Current.Response.Flush();
// Prevents any other content from being sent to the browser
HttpContext.Current.Response.SuppressContent = true;
//Directs the thread to finish, bypassing additional processing
HttpContext.Current.ApplicationInstance.CompleteRequest();
Thread.EndCriticalRegion();
}
}
Now I'm a relieved man.
This is how IIS works. It starts a new thread for the new request. The thread does it's stuff, and when it ends the thread is aborted. Normally, this happens in the .NET plumbing and it's handles there. However, it you do something like a Server.Redirect() it'll also get aborted - in your code. Similarly with completing the request yourself as you do. IIS says "It's sent the return, so kill it." That's how it works.
(The thread is probably saved for re-use by another request, but the code just finished on it is aborted.)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.