Moyen accepté d’empêcher l’exception «L’hôte distant a fermé la connexion»

Je reçois constamment l’exception suivante qui est provoquée par le lancement d’un téléchargement par un utilisateur et par conséquent par son échec (ou son annulation):

Message d’erreur: L’hôte distant a fermé la connexion. Le code d’erreur est 0x80072746. Stack Trace: à la page suivante: async) à System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse (Boolean isFinal) à System.Web.Hosting.ISAPIWorkerRequest.FlushResponse (Boolean finalFlush) à

J’ai cherché sur Internet et trouvé un article intéressant . Cependant, il ne semble pas y avoir de réponse définitive comme le meilleur moyen d’éviter que cela ne remplisse les journaux.

L’utilisateur ne voit aucune erreur et il n’y a pas de problème réel dans l’application, car elle survient uniquement (à ma connaissance) dans des situations indépendantes de sa volonté (utilisateur annulant le téléchargement ou la perte de connexion), mais il doit exister un moyen d’éviter qu’une telle exception ne se produise. signalé.

Je déteste le dire, mais je suis tenté de vérifier cette exception et de bloquer le bloc vide, mais cela me donne l’impression d’être un programmeur sale.

Alors, quelle est la méthode acceptée pour empêcher cette exception de remplir ma boîte aux lettres?

Vous ne pouvez pas empêcher un hôte distant de fermer quoi que ce soit.

Et dans certains protocoles, c’est la manière normale (ou du moins acceptée) de dire au revoir.

Vous devrez donc gérer cette exception spécifique .

L’erreur se produit lorsque vous essayez d’envoyer une réponse au client mais que celui-ci s’est déconnecté. Vous pouvez le vérifier en définissant un point d’arrêt sur Response.Redirect ou à l’endroit où vous envoyez des données au client, attendez que Visual Studio atteigne le point d’arrêt, puis annulez la demande dans IE (en utilisant le x dans la barre d’adresse). Cela devrait provoquer l’erreur.

Pour capturer l’erreur, vous pouvez utiliser les éléments suivants:

 try { Response.Redirect("~/SomePage.aspx"); Response.End(); } catch (System.Threading.ThreadAbortException) { // Do nothing. This will happen normally after the redirect. } catch (System.Web.HttpException ex) { if (ex.ErrorCode == unchecked((int)0x80070057)) //Error Code = -2147024809 { // Do nothing. This will happen if browser closes connection. } else { throw ex; } } 

Ou, en C # 6, vous pouvez utiliser des filtres d’exception pour éviter de devoir renvoyer l’erreur:

 try { Response.Redirect("~/SomePage.aspx"); Response.End(); } catch (System.Threading.ThreadAbortException) { // Do nothing. This will happen normally after the redirect. } catch (System.Web.HttpException ex) when (ex.ErrorCode == unchecked((int)0x80070057)) { // Do nothing. This will happen if browser closes connection. } 

Ce qui est une meilleure expérience de débogage puisqu’il s’arrêtera sur l’instruction qui lève l’exception avec l’état actuel et toutes les variables locales préservées au lieu d’être renvoyées à l’intérieur du bloc catch.

D’un sharepoint vue pratique, il n’y a rien de mal à annuler un téléchargement en raison d’un ordinateur éteint ou d’une session Web arrêtée. Par conséquent, intercepter des exceptions fermées sur un hôte distant est parfaitement acceptable.