Ogólnie oznacza to, że strona zdalna zamknęła połączenie (zwykle wysyłając TCP/IP RST
paczka). Jeśli pracujesz z aplikacją innej firmy, prawdopodobne przyczyny to:
- Wysyłasz zniekształcone dane do aplikacji (co może obejmować wysyłanie żądania HTTPS do serwera HTTP)
- Łącze sieciowe między klientem a serwerem z jakiegoś powodu nie działa
- Wywołałeś błąd w aplikacji innej firmy, który spowodował jej awarię
- Aplikacja innej firmy wyczerpała zasoby systemowe
Prawdopodobnie pierwszy przypadek to właśnie to, co się dzieje.
Możesz uruchomić Wireshark, aby zobaczyć dokładnie, co dzieje się na przewodzie, aby zawęzić problem.
Bez bardziej szczegółowych informacji jest mało prawdopodobne, że ktokolwiek tutaj może naprawdę Ci pomóc.
Użycie TLS 1.2 rozwiązało ten błąd.
Możesz zmusić swoją aplikację przy użyciu TLS 1.2 za pomocą tego (upewnij się, że wykonałeś go przed wywołaniem usługi):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Inne rozwiązanie:
Włącz silną kryptografię na swoim lokalnym komputerze lub serwerze, aby korzystać z TLS1.2, ponieważ domyślnie jest on wyłączony, więc używany jest tylko TLS1.0.
Aby włączyć silną kryptografię, wykonaj następujące polecenie w PowerShell z uprawnieniami administratora:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Aby zmiany zaczęły obowiązywać, musisz ponownie uruchomić komputer.
To nie jest błąd w twoim kodzie. Pochodzi z implementacji Socket .Net. Jeśli użyjesz przeciążonej implementacji EndReceive, jak poniżej, nie otrzymasz tego wyjątku.
SocketError errorCode;
int nBytesRec = socket.EndReceive(ar, out errorCode);
if (errorCode != SocketError.Success)
{
nBytesRec = 0;
}