Masalah: Saya mendapatkan pengecualian ini "THE UNDERLYING CONNECTION WAS CLOSED: AN UNEXPECTED ERROR OCCURRED ON A SEND" di log saya dan ini merusak integrasi OEM kami dengan sistem pemasaran email kami pada waktu acak yang bervariasi dari [1jam - 4 jam]
Situs web saya di-host di windows server 2008 R2 dengan IIS 7.5.7600. Situs web ini memiliki sejumlah besar komponen OEM dan dasbor yang komprehensif. Semuanya berfungsi dengan baik dengan semua elemen lain dari situs web kecuali dengan salah satu komponen pemasaran email kami yang kami gunakan sebagai solusi iframe di dalam dasbor kami. Cara kerjanya adalah, saya mengirim objek httpWebRequest dengan semua kredensial dan saya mendapatkan kembali url yang saya masukkan ke dalam iframe dan berfungsi. Tapi itu hanya bekerja untuk beberapa waktu [1 jam - 4 jam] dan kemudian saya mendapatkan pengecualian di bawah ini "THE UNDERLYING CONNECTION WAS CLOSED: AN UNEXPECTED ERROR OCCURRED ON A SEND" dan bahkan jika sistem mencoba untuk mendapatkan URL dari httpWebRequest itu gagal dengan pengecualian yang sama. Satu-satunya cara untuk membuatnya berfungsi kembali adalah dengan mendaur ulang kumpulan aplikasi atau apa pun yang diedit di web.config.
Opsi mencoba
Ditambahkan secara eksplisit, keep-alive = false
keep-alive = true
Meningkatkan waktu istirahat: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
Saya telah mengunggah halaman ini ke situs web non SSL untuk memeriksa apakah sertifikat SSL di server produksi kami membuat koneksi untuk menjatuhkan beberapa caranya.
Segala arah menuju resolusi sangat dihargai.
Kode:
Public Function CreateHttpRequestJson(ByVal url) As String
Try
Dim result As String = String.Empty
Dim httpWebRequest = DirectCast(WebRequest.Create("https://api.xxxxxxxxxxx.com/api/v3/externalsession.json"), HttpWebRequest)
httpWebRequest.ContentType = "text/json"
httpWebRequest.Method = "PUT"
httpWebRequest.ContentType = "application/x-www-form-urlencoded"
httpWebRequest.KeepAlive = False
'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
'TODO change the integratorID to the serviceproviders account Id, useremail
Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream())
Dim json As String = New JavaScriptSerializer().Serialize(New With { _
Key .Email = useremail, _
Key .Chrome = "None", _
Key .Url = url, _
Key .IntegratorID = userIntegratorID, _
Key .ClientID = clientIdGlobal _
})
'TODO move it to the web.config, Following API Key is holonis accounts API Key
SetBasicAuthHeader(httpWebRequest, holonisApiKey, "")
streamWriter.Write(json)
streamWriter.Flush()
streamWriter.Close()
Dim httpResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
Using streamReader = New StreamReader(httpResponse.GetResponseStream())
result = streamReader.ReadToEnd()
result = result.Split(New [Char]() {":"})(2)
result = "https:" & result.Substring(0, result.Length - 2)
End Using
End Using
Me.midFrame.Attributes("src") = result
Catch ex As Exception
objLog.WriteLog("Error:" & ex.Message)
If (ex.Message.ToString().Contains("Invalid Email")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Email Taken")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Invalid Access Level")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Unsafe Password")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Invalid Password")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Empty Person Name")) Then
'TODO Show message on UI
End If
End Try
End Function
Public Sub SetBasicAuthHeader(ByVal request As WebRequest, ByVal userName As [String], ByVal userPassword As [String])
Dim authInfo As String = Convert.ToString(userName) & ":" & Convert.ToString(userPassword)
authInfo = Convert.ToBase64String(Encoding.[Default].GetBytes(authInfo))
request.Headers("Authorization") = "Basic " & authInfo
End Sub`
sumber
Jawaban:
Bagi saya itu tls12:
sumber
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls
Jika Anda terjebak dengan .Net 4.0 dan situs target menggunakan TLS 1.2, Anda memerlukan baris berikut.
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
sumber: TLS 1.2 dan .NET Dukungan: Cara Mencegah Kesalahan Sambungan
sumber
(SecurityProtocolType)768
dapat digunakan untuk "Tls11" (yaitu TLS 1.1).Kode di bawah menyelesaikan masalah
sumber
ServicePointManager.SecurityProtocol
adalah objek statis yang berarti mengubah nilai ini akan memengaruhi semua sub-urutanWebRequest
atauWebClient
panggilan. Anda dapat membuat terpisahAppDomain
jika Anda inginServicePointManager
memiliki pengaturan yang berbeda. Lihat stackoverflow.com/questions/3791629/… untuk lebih jelasnya.Saya telah mengalami masalah yang sama selama berhari-hari sekarang dengan integrasi yang juga "dulu berfungsi sebelumnya".
Karena depresi belaka, saya hanya mencoba
Ini memecahkannya untuk saya .. meskipun integrasinya hanya menggunakan SSLv3.
Saya menyadari bahwa ada sesuatu yang mati sejak Fiddler melaporkan mengatakan bahwa ada "cipher negosiasi TLS kosong" atau semacamnya.
Semoga berhasil!
sumber
Dalam kasus saya, situs yang saya sambungkan telah ditingkatkan ke TLS 1.2. Akibatnya saya harus menginstal .net 4.5.2 di server web saya untuk mendukungnya.
sumber
Buka web.config / App.config Anda untuk memverifikasi runtime .net mana yang Anda gunakan
Inilah solusinya:
.NET 4.6 dan yang lebih baru. Anda tidak perlu melakukan pekerjaan tambahan apa pun untuk mendukung TLS 1.2, ini didukung secara default.
.NET 4.5. TLS 1.2 didukung, tetapi ini bukan protokol default. Anda harus ikut serta untuk menggunakannya. Kode berikut akan menjadikan TLS 1.2 default, pastikan untuk mengeksekusinya sebelum membuat koneksi ke sumber daya yang diamankan:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
sumber
Saya menemukan bahwa ini adalah tanda bahwa server tempat Anda menerapkan kode memiliki kerangka kerja .NET lama yang terpasang dan tidak mendukung TLS 1.1 atau TLS 1.2. Langkah-langkah untuk memperbaiki:
Anda bisa mendapatkan .NET Developer Pack dan Runtime terbaru dari URL ini: http://getdotnet.azurewebsites.net/target-dotnet-platforms.html
sumber
Kami mengalami masalah ini ketika situs web yang mengakses API kami mendapatkan pesan "Sambungan yang mendasarinya telah ditutup: Terjadi kesalahan yang tidak terduga saat pengiriman." pesan.
Kode mereka adalah campuran dari .NET 3.x dan 2.2, yang menurut saya berarti mereka menggunakan TLS 1.0.
Jawaban di bawah ini dapat membantu Anda mendiagnosis masalah dengan mengaktifkan TLS 1.0, SSL 2 dan SSL3, tetapi untuk memperjelasnya, Anda tidak ingin melakukan itu dalam jangka panjang karena ketiga protokol tersebut dianggap tidak aman dan seharusnya tidak lagi aman. digunakan :
Agar IIS kami merespons panggilan API mereka, kami harus menambahkan pengaturan registri di server IIS untuk secara eksplisit mengaktifkan versi TLS - CATATAN: Anda harus memulai ulang server Windows (bukan hanya layanan IIS) setelah melakukan perubahan ini:
Jika tidak berhasil, Anda juga dapat bereksperimen dengan menambahkan entri untuk SSL 2.0:
Untuk lebih jelasnya, ini bukan solusi yang bagus , dan solusi yang tepat adalah membuat penelepon menggunakan TLS 1.2, tetapi penjelasan di atas dapat membantu mendiagnosis bahwa inilah masalahnya.
Anda dapat dengan cepat menambahkan entri reg tersebut dengan skrip PowerShell ini:
Itu adalah versi skrip yang dimodifikasi dari halaman bantuan Microsoft untuk Menyiapkan TLS untuk VMM . Ini artikel basics.net adalah halaman yang awalnya memberi saya ide untuk melihat pengaturan ini.
sumber
Tambahkan saja:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
sumber
Jika membantu seseorang, masalah kami adalah dengan sertifikat yang hilang. Lingkungan adalah Windows Server 2016 Standard dengan .Net 4.6.
Ada URI https layanan WCF yang dihosting sendiri, di mana Service.Open () akan dijalankan tanpa kesalahan. Utas lain akan tetap mengakses https: // OurIp: 443 / OurService? Wsdl untuk memastikan bahwa layanan itu tersedia. Mengakses WSDL biasanya gagal dengan:
Koneksi yang mendasari ditutup: Terjadi kesalahan yang tidak terduga pada pengiriman.
Menggunakan ServicePointManager.SecurityProtocol dengan pengaturan yang berlaku tidak berfungsi. Bermain dengan peran dan fitur server juga tidak membantu. Kemudian melangkah ke Jaise George , SE, menyelesaikan masalah dalam beberapa menit. Jaise memasang sertifikat yang ditandatangani sendiri di IIS, mengatasi masalah tersebut. Inilah yang dia lakukan untuk mengatasi masalah tersebut:
(1) Buka manajer IIS (inetmgr) (2) Klik pada node server di panel kiri, dan klik dua kali "Sertifikat server". (3) Klik "Buat Sertifikat yang Ditandatangani Sendiri" di panel kanan dan ketik apa pun yang Anda inginkan untuk nama yang ramah. (4) Klik "Situs Web Default" di panel kiri, klik "Bindings" di panel kanan, klik "Tambah", pilih "https", pilih sertifikat yang baru saja Anda buat, dan klik "OK" (5) Akses URL https, itu harus dapat diakses.
sumber
Anda cukup mengubah versi aplikasi Anda seperti 4.0 menjadi 4.6 dan mempublikasikan kode tersebut.
Tambahkan juga baris kode di bawah ini:
sumber
Menggunakan proxy debugging HTTP dapat menyebabkan ini - seperti Fiddler.
Saya sedang memuat sertifikat PFX dari file lokal (otentikasi ke Apple.com) dan gagal karena Fiddler tidak dapat meneruskan sertifikat ini.
Coba nonaktifkan Fiddler untuk memeriksa dan jika itu solusinya maka Anda mungkin perlu menginstal sertifikat pada mesin Anda atau dengan cara tertentu agar Fiddler dapat menggunakannya.
sumber
Kode di bawah ini memecahkan masalah saya:
sumber