Короче говоря, я написал консольное приложение, которое просто вызывает хранимую процедуру в 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.