Saya bekerja dengan aplikasi komersial yang melempar SocketException dengan pesan,
Koneksi yang ada ditutup secara paksa oleh host jarak jauh
Ini terjadi dengan koneksi soket antara klien dan server. Sambungannya hidup dan baik, dan banyak data yang ditransfer, tetapi kemudian terputus entah dari mana.
Adakah yang pernah melihat ini sebelumnya? Apa penyebabnya? Saya bisa menebak beberapa penyebab, tetapi juga adakah cara untuk menambahkan lebih banyak ke dalam kode ini untuk mengetahui apa penyebabnya?
Setiap komentar / ide dipersilakan.
... Terbaru ...
Saya memiliki beberapa pencatatan dari beberapa pelacakan .NET,
System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z
System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z
System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0
Berdasarkan bagian lain dari logging saya telah melihat fakta bahwa ia mengatakan '0 # 0' berarti paket panjang 0 byte sedang dikirim. Tapi, apa arti sebenarnya?
Salah satu dari dua kemungkinan terjadi, dan saya tidak yakin yang mana,
1) Koneksi sedang ditutup, tetapi data kemudian ditulis ke soket, sehingga menciptakan pengecualian di atas. 0 # 0 berarti tidak ada yang dikirim karena soket sudah ditutup.
2) Sambungan masih terbuka, dan paket nol byte sedang dikirim (yaitu kode memiliki bug) dan 0 # 0 berarti bahwa paket nol byte sedang mencoba dikirim.
Menurutmu apa? Mungkin tidak meyakinkan saya kira, tetapi mungkin orang lain telah melihat hal semacam ini?
sumber
Jawaban:
Ini umumnya berarti bahwa sisi jauh menutup koneksi (biasanya dengan mengirim paket TCP / IP
RST
). Jika Anda bekerja dengan aplikasi pihak ketiga, kemungkinan penyebabnya adalah:Kemungkinan kasus pertama adalah apa yang terjadi.
Anda dapat menjalankan Wireshark untuk melihat apa yang terjadi pada kabel untuk mempersempit masalah.
Tanpa informasi yang lebih spesifik, tidak mungkin ada orang di sini yang benar-benar dapat membantu Anda.
sumber
https
permintaan kehttp
server dan mungkin sebaliknya.Menggunakan TLS 1.2 menyelesaikan kesalahan ini.
Anda dapat memaksa aplikasi Anda menggunakan TLS 1.2 dengan ini (pastikan untuk menjalankannya sebelum memanggil layanan Anda):
Solusi lain:
Aktifkan kriptografi yang kuat di mesin atau server lokal Anda untuk menggunakan TLS1.2 karena secara default itu dinonaktifkan sehingga hanya TLS1.0 yang digunakan.
Untuk mengaktifkan kriptografi yang kuat, jalankan perintah ini di PowerShell dengan hak admin:
Anda harus me-reboot komputer Anda agar perubahan ini dapat diterapkan.
sumber
Ini bukan bug dalam kode Anda. Itu berasal dari implementasi Socket Net. Jika Anda menggunakan implementasi EndReceive yang kelebihan beban seperti di bawah ini, Anda tidak akan mendapatkan pengecualian ini.
sumber
EndReceive
melemparkan pengecualian ketika ada pemutusan klien yang anggun. Tidak tahu ini dari desain. Saya merasa desain yang buruk untuk membuang pengecualian dalam aliran kode normal. Terima kasih Tuhan atas metode kelebihan beban.StateObject
kelas denganpublic byte[] buffer = new byte[1024], public Socket socket;
dan memanggil fungsi yang dipanggilReceive(Socket s)
, yang tidakStateObject so = new StateObject(); so.socket = s; s.BeginReceive(so.buffer, 0, 256, 0, new AsyncCallback(ReceiveCallback), so);
dan dalamvoid ReceiveCallback(IAsyncResult ar)
Anda memanggil kode itu, di atas.Send
sebelum Anda dapat melakukan hal lain.Solusi sederhana untuk masalah umum yang menjengkelkan ini:
Buka saja file ".context.cs" Anda (terletak di bawah " .context.tt" yang terletak di bawah file "* .edmx" Anda).
Lalu, tambahkan baris ini ke konstruktor Anda:
Semoga ini bermanfaat.
sumber
socket.Send(x); byte[] buffer = new byte[1]; socket.Receive(buffer, 0, 1, 0);
untuk membaca byte yang dikembalikan, yang merupakan masalah OP.ENTITY FRAMEWORK
hanya menggunakan solusi ini berfungsi !!! hanya ini ! terima kasih bro :)Punya bug yang sama. Sebenarnya berfungsi jika lalu lintas dikirim menggunakan beberapa proxy (pemain biola dalam kasus saya). Kerangka .NET diperbarui dari 4.5.2 hingga> = 4.6 dan sekarang semuanya berfungsi dengan baik. Permintaan aktual adalah:
new WebClient().DownloadData("URL");
Pengecualian adalah:
sumber
Saya mendapatkan pengecualian ini karena referensi melingkar pada entitas. Pada entitas yang terlihat seperti
Saya menambahkan [IgnoreDataMemberAttribute] ke properti Parent. Dan itu memecahkan masalah.
sumber
Jika Berjalan Di Layanan .Net 4.5.2
Bagi saya masalah ini diperparah karena panggilan berjalan di layanan .Net 4.5.2. Saya mengikuti saran @willmaz tetapi mendapat kesalahan baru.
Dalam menjalankan layanan dengan logging dihidupkan, saya melihat jabat tangan dengan situs target akan memulai ok (dan mengirim token pembawa) tetapi pada langkah berikut untuk memproses panggilan Post, tampaknya akan menjatuhkan token auth dan situs akan balas dengan
Unauthorized
.Ternyata kredensial kumpulan layanan tidak memiliki hak untuk mengubah TLS (?) Dan ketika saya memasukkan akun admin lokal saya ke kumpulan, semuanya berfungsi.
sumber
Bagi siapa pun yang mendapatkan pengecualian ini saat membaca data dari aliran, ini dapat membantu. Saya mendapatkan pengecualian ini ketika membaca HttpResponseMessage dalam satu lingkaran seperti ini:
Setelah beberapa waktu saya menemukan pelakunya adalah ukuran buffer, yang terlalu kecil dan tidak cocok dengan contoh Azure saya yang lemah. Yang membantu adalah mengubah kode menjadi:
Metode CopyTo () memiliki ukuran buffer default 81920. Semakin besar buffer mempercepat proses dan kesalahan segera berhenti, kemungkinan besar karena keseluruhan kecepatan unduhan meningkat. Tetapi mengapa kecepatan unduh penting untuk mencegah kesalahan ini?
Mungkin saja Anda terputus dari server karena kecepatan unduh turun di bawah ambang batas minimum yang dikonfigurasikan oleh server. Misalnya, jika aplikasi yang Anda unduh file di-host pada IIS, itu bisa menjadi masalah dengan konfigurasi http.sys:
"Http.sys adalah tumpukan protokol http yang digunakan IIS untuk melakukan komunikasi http dengan klien. Ia memiliki timer yang disebut MinBytesPerSecond yang bertanggung jawab untuk mematikan koneksi jika laju transfer turun di bawah ambang kb / detik. Secara default, ambang tersebut adalah setel ke 240 kb / detik. "
Masalahnya dijelaskan dalam blogpost lama ini dari tim pengembangan TFS dan secara khusus menyangkut IIS, tetapi mungkin mengarahkan Anda ke arah yang benar. Itu juga menyebutkan bug lama yang terkait dengan atribut http.sys ini: tautan
Jika Anda menggunakan layanan aplikasi Azure dan meningkatkan ukuran buffer tidak menghilangkan masalah, cobalah untuk meningkatkan mesin Anda juga. Anda akan dialokasikan lebih banyak sumber daya termasuk bandwidth koneksi.
sumber
Saya memiliki masalah yang sama dan akhirnya berhasil menyelesaikannya. Dalam kasus saya, port tempat klien mengirim permintaan tidak memiliki sertifikat SSL yang mengikatnya. Jadi saya memperbaiki masalah dengan mengikat sertifikat SSL ke port di sisi server. Setelah itu selesai, pengecualian ini hilang.
sumber
Kesalahan ini terjadi pada aplikasi saya dengan protokol CIP setiap kali saya tidak mengirim atau menerima data dalam waktu kurang dari 10 detik.
Ini disebabkan oleh penggunaan metode forward open. Anda dapat menghindari ini dengan bekerja dengan metode lain, atau untuk menginstal tingkat pembaruan kurang dari 10-an yang menjaga koneksi terbuka-depan Anda.
sumber