provider: SSL Provider, ошибка: 0 - существующее соединение было принудительно закрыто удаленным хостом - PullRequest
0 голосов
/ 03 марта 2020

Короче говоря, я написал консольное приложение, которое просто вызывает хранимую процедуру в SQL базе данных сервера. Затем настройте событие Windows Task Scheduler, чтобы каждые 5 минут вызывать файл .exe консольного приложения. В большинстве случаев это работает, однако примерно 10 раз в день мы получаем следующее исключение sqlException, как только открывается соединение для вызова хранимой процедуры:

System.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, 
but then an error occurred during the login process. 
(provider: SSL Provider, error: 0 - An existing connection was forcibly closed by the remote host.) 

Я временно встроил попытку блокировка с простыми 5 попытками и короткой паузой между ними, и это помогло некоторым, но есть все еще несколько раз в день, которые терпят неудачу все 5 раз. Я думаю, что это должно быть какой-то проблемой со связью, но я даже не уверен, где искать.

Большая часть исследований, которые я провел, указывает на проблемы TLS или брандмауэра. Я не являюсь экспертом ни в одном из них, но я думаю, что если бы кто-то из них был причиной, он постоянно получал ошибку. То же самое со ссылкой на SSL. С другой стороны, по той же причине я не понимаю, как это могло быть проблемой кодирования либо с консольным приложением, либо с хранимой процедурой, поэтому у меня нет идей.

Код подключения SQL выглядит примерно так:


    Public Function GetDataTable(tsql As String, Optional ConnectionString As String = Nothing, Optional TryNum As Integer = 1) As DataTable
        Try
            Dim dt As DataTable
            Using conn As SqlConnection = New SqlConnection(If(Not ConnectionString Is Nothing, ConnectionString, SConn))
                conn.Open()
                Using dr As SqlDataReader = (New SqlCommand With {.CommandType = CommandType.Text, .CommandText = tsql, .Connection = conn, .CommandTimeout = SqlCommandTimeout}).ExecuteReader
                    dt = New DataTable()
                    dt.Load(dr)
                    dr.Close()
                End Using
                conn.Close()
            End Using
            Return dt
        Catch exSQL As System.Data.SqlClient.SqlException
            If exSQL.ToString.Contains("A connection was successfully established with the server, but then an error occurred during the login process.") AndAlso TryNum < MaxTries Then
                Threading.Thread.Sleep(RetryWaitMS)
                Return GetDataTable(tsql, ConnectionString, TryNum + 1)
            Else
                SendMsg(ERROR_EMAIL_GROUP, ERROR_EMAIL_GROUP, "CommonUtils - SQL Error", tsql & vbCrLf & exSQL.ToString)
                Throw exSQL
            End If
        End Try
    End Function

Пожалуйста, не начинайте с того, что не используете Parameters.AddWithValue et c и SQL Injection.

...