Les méthodes Socket.End ne lèvent pas d’exception ObjectDisposedException
Les méthodes System.Net.Sockets.Socket.End*
(par exemple EndSend) lèvent une SocketException au lieu d’une ObjectDisposedException si le socket est fermé.
Comportement précédent
Auparavant, les méthodes affectées levaient une ObjectDisposedException pour les sockets fermés.
Nouveau comportement
À compter de .NET 7, les méthodes affectées lèvent une SocketException avec SocketErrorCode défini sur SocketError.OperationAborted pour les sockets fermés.
Version introduite
.NET 7
Type de changement cassant
Ce changement peut affecter la compatibilité binaire.
Raison du changement
Les API de modèle de programmation asynchrone (APM) sont celles nommées Begin*
et End*
. À compter de .NET 6, ces API héritées bénéficient d’une implémentation basée sur Task
dans le cadre d’un effort de consolidation et de simplification du codebase de Socket
. Malheureusement, avec l’implémentation 6.0, des événements inattendus étaient parfois déclenchés sur TaskScheduler.UnobservedTaskException. Ceci se produisait même quand les API étaient utilisées correctement, ce qui signifie que le code appelant appelait toujours les méthodes End*
, y compris quand le socket était fermé.
Le changement pour lever une SocketException a été fait de façon à garantir qu’aucune exception non observée n’est divulguée dans de tels cas.
Action recommandée
Si votre code intercepte une ObjectDisposedException provenant d’une des méthodes Socket.End*
, modifiez-le pour intercepter SocketException et reportez-vous à SocketException.SocketErrorCode pour connaître la raison sous-jacente.
Notes
Le code APM doit toujours vérifier que les méthodes End*
sont appelées après les méthodes Begin*
correspondantes, même si le socket est fermé.
API affectées
- System.Net.Sockets.Socket.EndConnect(IAsyncResult)
- System.Net.Sockets.Socket.EndDisconnect(IAsyncResult)
- System.Net.Sockets.Socket.EndSend
- System.Net.Sockets.Socket.EndSendFile(IAsyncResult)
- System.Net.Sockets.Socket.EndSendTo(IAsyncResult)
- System.Net.Sockets.Socket.EndReceive
- System.Net.Sockets.Socket.EndAccept
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour