Metody Socket.End nie zgłaszają wyjątku ObjectDisposedException
System.Net.Sockets.Socket.End*
metody (na przykład EndSend) zgłaszają wartość SocketException zamiast ObjectDisposedException , jeśli gniazdo jest zamknięte.
Poprzednie zachowanie
Wcześniej metody, których dotyczy problem, rzuciły dla ObjectDisposedException zamkniętych gniazd.
Nowe zachowanie
Począwszy od platformy .NET 7, których dotyczy problem, metody zgłaszają wartość z ustawioną wartością SocketError.OperationAbortedSocketExceptionSocketErrorCode dla zamkniętych gniazd.
Wprowadzona wersja
.NET 7
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Interfejsy API modelu programowania asynchronicznego (APM) to te interfejsy o nazwach Begin*
i End*
. Począwszy od platformy .NET 6, te starsze interfejsy API są wspierane z implementacją opartą Task
na architekturze w ramach wysiłku w celu skonsolidowania i uproszczenia Socket
bazy kodu. Niestety, w przypadku implementacji w wersji 6.0 nieoczekiwane zdarzenia były czasami wywoływane w systemie TaskScheduler.UnobservedTaskException. Stało się tak nawet wtedy, gdy interfejsy API były prawidłowo używane, co oznacza, że kod wywołujący zawsze wywołuje End*
metody, w tym w przypadku zamknięcia gniazda.
Zmiana w celu zgłoszenia SocketException została wprowadzona w celu zapewnienia, że w takich przypadkach nie ujawniono żadnych nieobserwowanych wyjątków.
Zalecana akcja
Jeśli kod przechwytuje element ObjectDisposedException z dowolnej z Socket.End*
metod, zmień go, aby przechwycić SocketException i odwołać się do SocketException.SocketErrorCode zapytania o przyczynę bazową.
Uwaga
Kod APM powinien zawsze upewnić się, że End*
metody są wywoływane po odpowiednich Begin*
metodach, nawet jeśli gniazdo jest zamknięte.
Dotyczy interfejsów API
- 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