登录前握手期间发生错误

Cod*_*ior 12 .net c# sql-server connection-string database-connection

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

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

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

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

的背景

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

这一次,有

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

最后,我突发奇想,创建了一个新项目,其唯一目的是连接到同一个SQL服务器.我将连接字符串从非工作项目复制到新项目中并连接.是否存在某种每个项目的连接缓存?在Clean> Rebuild以及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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ior 0

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

真正奇怪的是连接字符串几个月来都没有出现问题,然后突然停止了。当时,应用程序名称值类似于应用程序名称=“MyProgram.DAL.Culture=en,PublicKeyToken=1a1a1a1a1a1a1a1a,版本=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;
    }
Run Code Online (Sandbox Code Playgroud)