登录前握手期间发生错误

时间:2017-04-24 20:37:52

标签: c# .net sql-server database-connection connection-string

请在将此标记为重复之前完整阅读。

在我正在调试的项目中,我收到一个SqlException,说明如下:

  

附加信息:已成功与服务器建立连接,但在登录前握手期间发生错误。 (提供者:SSL提供者,错误:0 - 等待操作超时。)

这发生在调试会话期间,前一个会话仅在几秒钟之前执行而没有问题。自初始异常以来,我无法连接到此项目中的数据库服务器。 SqlConnection.Open()方法调用抛出异常。

背景

这不是我第一次收到这个。在此之前,我花了两个星期的努力,最终为它启动了微软的支持票。在那个例子中,事实证明连接字符串上的ApplicationName属性太长(我们使用的是完全限定的程序集名称)并缩短它可以缓解这个问题。

这一次,有

  • 未提供ApplicationName值
  • WinSocks处于默认状态
  • 防病毒(ESET)已被禁用,不是问题。
  • 在工作和非工作调试会话之间没有安装任何内容

最后,我一时兴起,创建了一个新项目,其唯一目的是连接到同一个SQL服务器。我将连接字符串从非工作项目复制到新项目中并连接。是否存在某种每个项目的连接缓存?在Clean>重建和重新启动Visual Studio和Windows的情况下还能存活下来吗?

相关代码

    public SqlConnection OpenSqlConnection(string connectionString)
    {
        var conn = new SqlConnection(connectionString);
        conn.Open();
        _connectionString = connectionString;
        var sb = new SqlConnectionStringBuilder(_connectionString);
        _server = sb.DataSource;
        _database = sb.InitialCatalog;
        return conn;
    }

传入的连接字符串是从应用程序中其他位置的SqlConnectionStringBuilder输出的。连接字符串类似于:"Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"

4 个答案:

答案 0 :(得分:2)

尝试将Application Name=MyAppName;显式添加到连接字符串。程序集名称中自动生成的值可能会超出某个限制。

检查网络设置,查看明确限制的帧大小。如果SQL Server在另一台计算机上运行,​​则重新启动路由器。

尝试将Pooling=False;添加到连接字符串,并检查这是否解决了应用程序重启时重复连接的问题。

答案 1 :(得分:1)

对我来说,诀窍是增加连接字符串的超时,因为当通过vpn连接时,建立连接花了很长时间。您可以通过添加; connection timeout = value

来完成此操作

当我在vpn上连接尝试连接到sql server的应用程序时,我遇到了同样的错误。

默认情况下,超时设置为15秒。

似乎你已经有60秒了,也许你只需要更多......

希望它有所帮助!

答案 2 :(得分:1)

此问题可能与中间进行SSL检查的防火墙有关。

我建议您或者使用不进行SSL检查的其他连接重试,或者要求防火墙管理员为您要连接的源和/或目标创建免除项目,

干杯!

答案 3 :(得分:0)

所以这个问题继续困扰着我,看起来这是我家网络(我是一个远程开发人员)和通过VPN访问的工作网络滞后的一个功能。我对工作网络上的服务器的平均ping时间为100毫秒。

真正奇怪的是连接字符串数月没有问题,然后突然停止。当时,Application Name值类似于Application Name =" MyProgram.DAL。 Culture = en,PublicKeyToken = 1a1a1a1a1a1a1a1a,Version = 1.0.0.0"。换句话说,一个完全限定的程序集名称。最后我将其更改为缩短的" MyProgram.DAL"输入名称,然后再次使用。

几个月后,我又被它困扰了。我碰巧发现,如果我只吃异常并等了几滴,一切都很好。应用程序很乐意使用连接,即使它报告它失败了。因此,我将方法改为:

    public SqlConnection OpenSqlConnection(string connectionString)
    {
        var conn = new SqlConnection(connectionString);
        var retries = 10;
        while (conn.State != ConnectionState.Open && retries > 0)
        {
            try
            {
                conn.Open();
            }
            catch (Exception)
            {

            }
            Thread.Sleep(500);
            retries--;
        }

        _connectionString = connectionString;
        var sb = new SqlConnectionStringBuilder(_connectionString);
        _server = sb.DataSource;
        _database = sb.InitialCatalog;
        return conn;
    }
相关问题