Contexte.Réponse.Fin() et le Fil a été interrompue
Je suis en train de fermer la réponse à l'aide de Context.Response.End
mais recevoir le message d'erreur "Thread was being aborted"
.
Comment puis-je fermer correctement la réponse sans le déclenchement d'une exception?
try {
Context.Response.Clear();
Context.Response.ContentType = "text/html";
//Context.Response.ContentType = "application/json";
JsonObjectCollection collection = new JsonObjectCollection();
collection.Add(new JsonNumericValue("resultcode", 1));
collection.Add(new JsonStringValue("sourceurl", exchangeData.cUrl));
collection.Add(new JsonStringValue("filename", fileName));
collection.Add(new JsonStringValue("filesize", fileSize));
collection.Add(new JsonStringValue("fileurl", Common.GetPDFURL + outputFileName));
JsonUtility.GenerateIndentedJsonText = true;
Context.Response.Write(collection);
try {
Context.Response.End();
} catch (ThreadAbortException exc) {
//This should be first catch block i.e. before generic Exception
//This Catch block is to absorb exception thrown by Response.End
}
} catch (Exception err) {
}
Résolu par moi-même, le code devrait ressembler à
try {
Context.Response.End();
} catch (ThreadAbortException err) {
}
catch (Exception err) {
}
- avez-vous le respose.fin à l'intérieur d'un bloc try catch?
- J'ai ajouté mon code. Oui, j'ai ajouté Contexte.Réponse.Fin(); dans un bloc Try/catch et que vous voyez là est le principal bloc Try/catch qui est aussi attraper erreur "Thread a été interrompue".
- Résolu par moi-même, le code devrait ressembler à try { } catch (ThreadAbortException err) { } catch (Exception err) { }
Vous devez vous connecter pour publier un commentaire.
Est-il une raison spécifique que vous n'utilisez pas
context.ApplicationInstance.CompleteRequest()
à la place?Cette méthode de court-circuit de la ASP.NET pipeline (sauf pour l'événement EndRequest) sans jeter la
ThreadAbortException
donc vous n'aurez pas besoin de l'appointtry
/catch
bloc, et vous aurez également l'expérience de meilleures performances.Essayer réponse.OutputStream.Close(); au lieu de réponse.Fin();
Ça va aider!
Erreur: le Fil a été interrompue. au Système.Le filetage.Fil de discussion.AbortInternal() au Système.Le filetage.Fil de discussion.Abort(Objet stateInfo) au Système.Web.HttpResponse.Fin()
Cette erreur se produit surtout Si Vous Utilisez de la Réponse.Fin, La Réponse.Redirection, ou d'un Serveur.Transfert
Cause: La Réponse.Fin de la méthode se termine l'exécution de page et les changements de l'exécution de la Application_EndRequest événement dans l'application à des événements de pipeline. La ligne de code qui suit Réponse.La fin n'est pas exécutée.
Ce problème se produit dans la Réponse.Rediriger l'utilisateur et le Serveur.Méthodes de transfert parce que les deux méthodes de Réponse à un appel.Fin à l'interne.
Résolution/Solution:
Vous pouvez utiliser une instruction try-catch pour attraper cette exception
ou
Pour La Réponse.Fin, appelez le HttpContext.Actuel.ApplicationInstance.CompleteRequest méthode au lieu de Réponse.Fin de contourner l'exécution de code à la Application_EndRequest événement. Pour La Réponse.Rediriger, l'utilisation d'une surcharge, une Réponse.Redirection(String url, bool endResponse) qui passe à false pour le endResponse paramètre pour supprimer l'appel interne à la Réponse.Fin. Par exemple: ex: la Réponse.Redirect (“nextpage.aspx”, false); Si vous utilisez cette solution de contournement, le code qui suit Réponse.Redirection est exécuté. Pour Le Serveur.Le transfert, l'utilisation du Serveur.Méthode Execute à la place.
Je recommande cette solution :
N'utilisez pas de réponse.Fin();
Déclarer ce mondial var : bool isFileDownLoad;
Juste après votre réponse.Écrire(sw.ToString());) jeu ==> isFileDownLoad = true;
Remplacer votre Rendu comme :
///
///AEG : Très important de manipuler le fil interrompu exception
///
///
override protected void Render(HtmlTextWriter w)
{
if (!isFileDownLoad) de la base.Render(w);
}
Ou vous pouvez placer le contexte.Réponse.Fin() à l'intérieur d'un enfin bloc. De cette façon, vous n'avez pas de soins sur les indésirables ThreadAbortException, ni ignorer réel ThreadAbortException (ce qui est mauvais). Vous ne pouvez pas ignorer les étapes du pipeline.
Cela m'a aidé à gérer
Thread was being aborted
exception,si vous utilisez la suite le code suivant à la place de
HttpContext.Current.Response.End()
, vous obtiendrezServer cannot append header after HTTP headers have been sent
exception.Un Correctif que j'ai trouvé est
Thread.BeginCriticalRegion();
Espère que cela aide