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.

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