Sql server 提供程序:SSL提供程序,错误:0-远程主机已强制关闭现有连接

Sql server 提供程序:SSL提供程序,错误:0-远程主机已强制关闭现有连接,sql-server,ssl,sqlexception,Sql Server,Ssl,Sqlexception,简而言之,我编写了一个控制台应用程序,它只调用SQL Server数据库中的存储过程。然后设置Windows任务计划程序事件,以每5分钟调用控制台应用程序的.exe文件。但是,在大多数情况下,只要打开连接以调用存储过程,我们就会收到以下sqlException,大约每天10次: System.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, b

简而言之,我编写了一个控制台应用程序,它只调用SQL Server数据库中的存储过程。然后设置Windows任务计划程序事件,以每5分钟调用控制台应用程序的.exe文件。但是,在大多数情况下,只要打开连接以调用存储过程,我们就会收到以下sqlException,大约每天10次:

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.) 
我临时建立了一个try块,只进行了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

公共函数GetDataTable(tsql作为字符串,可选ConnectionString作为字符串=Nothing,可选TryNum作为整数=1)作为DataTable
尝试
作为数据表的Dim dt
使用conn作为SqlConnection=newsqlconnection(If(notconnectionstring为Nothing,ConnectionString,SConn))
康涅狄格州公开赛
使用dr作为SqlDataReader=(新的SqlCommand,带有{.CommandType=CommandType.Text、.CommandText=tsql、.Connection=conn、.CommandTimeout=SqlCommandTimeout})。ExecuteReader
dt=新数据表()
dt.负载(dr)
克洛斯博士()
终端使用
康涅狄格州关闭
终端使用
返回dt
将exSQL捕获为System.Data.SqlClient.SqlException
如果exSQL.ToString.Contains(“已成功建立与服务器的连接,但在登录过程中发生了错误。”)和also TryNum

请不要从不使用Parameters.AddWithValue等和SQL注入开始

我也有同样的问题,这就是原因:

“在Windows Server 2012 R2上运行的应用程序尝试连接到在Windows Server 2019上运行的SQL Server时,也会出现此问题。”


我们可以看看您连接到db的代码吗?我已经添加了连接代码。我的第一个猜测是,这是一个与网络相关的问题,而不是您的代码问题。如果是你的代码,问题就不会是随机的,也不会通过重试来解决。嗯,我要标记这个,因为它看起来很有希望。我会和我们的服务员分享的。非常感谢你。起初我想知道为什么我花了几个小时的搜索没有找到那篇文章,但我看到这篇文章是在我停止搜索一个月后写的。在过去几周里,我又有几个案例证实了这个解决方案解决了这个问题。如前所述,禁用SSL密码套件修复了我的问题。这是因为最近在我的案例中,SQL server中出现了服务器强化补丁。