J'ai essayé de convertir mon ensemble de données en Excel et de télécharger cet excel. J'ai obtenu mon fichier Excel requis, mais System.Threading.ThreadAbortException a été soulevé à chaque téléchargement Excel. Comment résoudre ce problème? .. Aidez-moi s'il vous plaît ...
J'appelle cette méthode dans mon écran aspx. La même exception a également été levée par cette méthode.
J'appelle cette fonction publique void ExportDataSet (DataSet ds) dans de nombreux écrans aspx et je maintiens également la méthode d'enregistrement des erreurs pour les exceptions qui sont déclenchées au moment de l'exécution, ces exceptions sont écrites dans des fichiers .txt. Donc, cette même exception est enregistrée dans tous les fichiers txt de l'écran aspx.Je veux juste éviter que cette exception ne soit lancée depuis le fichier de classe déclaré par la méthode vers aspx. Je veux simplement gérer cette exception dans mon fichier de classe de déclaration de méthode lui-même.
Appel de méthode de fichier ASPX: excel.ExportDataSet (dsExcel);
Définition de la méthode:
public void ExportDataSet(DataSet ds)
{
try
{
string filename = "ExcelFile.xls";
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.Charset = "";
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
GridView dg = new GridView();
dg.DataSource = ds.Tables[0];
dg.DataBind();
dg.RenderControl(htw);
// response.Write(style);
response.Write(sw.ToString());
response.End(); // Exception was Raised at here
}
}
}
catch (Exception ex)
{
string Err = ex.Message.ToString();
EsHelper.EsADLogger("HOQCMgmt.aspx ibtnExcelAll_Click()", ex.Message.ToString());
}
finally
{
}
}
Response.End
voir stackoverflow.com/a/3917180/2864740 (et les autres réponses); notez que l'exception est "à prévoir" car c'est la façon dont la pile est déroulée (donc n'attrapez pas cette exception). Si vous souhaitez toujours intercepter [autres] exceptions, utilisez:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
Réponses:
J'ai fait des recherches en ligne et j'ai vu que le
Response.End()
jette toujours une exception.Remplacez ceci:
HttpContext.Current.Response.End();
Avec ça:
la source
Response.End()
cela ne fonctionne pas , pourquoi la réponse suggérée a égalementResponse.End()
à la dernière ligne? Au lieu de cela, la réponse de @Binny (ci-dessous) aide!Cela m'a aidé à gérer l'
Thread was being aborted
exception,si vous utilisez le code suivant au lieu de
HttpContext.Current.Response.End()
, vous obtiendrez uneServer cannot append header after HTTP headers have been sent
exception.J'espère que ça aide
la source
Response.End()
ne fonctionne pas, mais la méthode suggérée a égalementResponse.End()
à la dernière ligne?Cela semble être la même question que:
Lorsqu'un ASP.NET System.Web.HttpResponse.End () est appelé, le thread actuel est abandonné?
C'est donc par conception. Vous devez ajouter une capture pour cette exception et "l'ignorer" gracieusement.
la source
Déplacez le Response.End () vers l'extérieur des blocs Try / Catch et Using.
Il est supposé lancer une exception pour contourner le reste de la requête, vous n'étiez simplement pas supposé l'attraper.
la source
Il suffit de mettre le
dans un bloc finally plutôt que dans le bloc try.
Cela a fonctionné pour moi !!!.
J'ai eu la structure de code problématique suivante (avec l'exception)
et il jette l'exception. Je soupçonne que l'exception est lancée là où il y a du code / travail à exécuter après response.End (); . Dans mon cas, le code supplémentaire n'était que le retour lui-même.
Quand je viens de déplacer la réponse.End (); au bloc finally (et a laissé le retour à sa place - ce qui provoque le saut du reste du code dans le bloc try et le saut vers le bloc finally (pas seulement la sortie de la fonction contenant)), l'exception a cessé d'avoir lieu.
Ce qui suit fonctionne bien:
la source
Utilisez un bloc catch spécial pour l'exception de la méthode Response.End ()
Ou supprimez simplement Response.End () si vous créez un gestionnaire de fichiers
la source
Pour moi ne fonctionne que
https://stackoverflow.com/a/21043051/1828356
la source
J'ai supprimé le linkbutton de UpdatePanel et j'ai également commenté le succès Response.End () !!!
la source
l'erreur pour Response.END (); est parce que vous utilisez un panneau de mise à jour asp ou tout contrôle utilisant javascript, essayez d'utiliser le contrôle natif d'asp ou html sans javascript ou scriptmanager ou script et réessayez
la source
Ce n'est pas un problème, mais c'est par conception. La cause première est décrite dans la page de support Microsoft.
La méthode Response.End met fin à l'exécution de la page et décale l'exécution vers l'événement Application_EndRequest dans le pipeline d'événements de l'application. La ligne de code qui suit Response.End n'est pas exécutée.
La solution fournie est:
Pour Response.End, appelez la méthode HttpContext.Current.ApplicationInstance.CompleteRequest au lieu de Response.End pour contourner l'exécution du code à l'événement Application_EndRequest
Voici le lien: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi
la source
vider la réponse au client avant response.end ()
En savoir plus sur la méthode Response.Flush
Utilisez donc le code ci-dessous avant
response.End();
la source
J'ai utilisé tous les changements ci-dessus mais j'obtenais toujours le même problème sur mon application Web.
Ensuite, j'ai contacté mon fournisseur d'hébergement et leur ai demandé de vérifier si un logiciel ou un antivirus bloquait nos fichiers à transférer via HTTP. ou le FAI / le réseau n'autorise pas le transfert de fichier.
Ils ont vérifié les paramètres du serveur et contourné le "Pare-feu partagé du centre de données" pour mon serveur et maintenant notre application est capable de télécharger le fichier.
J'espère que cette réponse aidera quelqu'un.C'est ce qui a fonctionné pour moi
la source
J'ai trouvé la raison. Si vous supprimez les panneaux de mise à jour, tout fonctionne bien!
la source
Je recommande cette solution:
Ne pas utiliser
response.End();
Déclarez cette variable globale:
bool isFileDownLoad;
Juste après votre
(response.Write(sw.ToString());) set ==> isFileDownLoad = true;
Remplacez votre rendu comme:
la source
J'ai trouvé que ce qui suit fonctionnait mieux ...
la source
Pour moi, cela m'a aidé à enregistrer un bouton qui appelle le code derrière le code en tant que contrôle de publication.
la source