C# 登录前握手时出错

C# 登录前握手时出错,c#,.net,sql-server,database-connection,connection-string,C#,.net,Sql Server,Database Connection,Connection String,请阅读全文,然后将其标记为副本。 在我正在调试的项目中,我收到一个SqlException,上面说: 其他信息:已成功与服务器建立连接,但在预登录握手过程中发生错误。(提供程序:SSL提供程序,错误:0-等待操作超时。) 这发生在调试会话期间,其中前一个会话仅在几秒钟前执行,没有问题。由于初始异常,我无法连接到此项目中的数据库服务器在SqlConnection.Open()方法调用时引发异常。 背景 这不是我第一次收到这个。之前,我与它斗争了两周,最终启动了微软的支持票。在那个实例中,连接字符串

请阅读全文,然后将其标记为副本。

在我正在调试的项目中,我收到一个SqlException,上面说:

其他信息:已成功与服务器建立连接,但在预登录握手过程中发生错误。(提供程序:SSL提供程序,错误:0-等待操作超时。)

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

背景 这不是我第一次收到这个。之前,我与它斗争了两周,最终启动了微软的支持票。在那个实例中,连接字符串上的ApplicationName属性太长(我们使用的是完全限定的程序集名称),缩短它可以缓解问题

这一次,有

  • 未提供ApplicationName值
  • WinSocks处于默认状态
  • 防病毒(ESET)已禁用,不是问题所在
  • 在工作和非工作调试会话之间未安装任何内容
最后,我一时兴起创建了一个新项目,其唯一目的就是连接到同一台SQL server。我将非工作项目中的连接字符串复制到新项目中,并进行连接。是否正在进行某种项目连接缓存?在清理>重建和重新启动Visual Studio和Windows后还能存活下来的东西

相关代码
传入的连接字符串是从应用程序中其他位置的SqlConnectionStringBuilder输出的。连接字符串类似于:
“数据源=服务器;初始目录=数据库;集成安全性=True;连接超时=60”
尝试显式添加
应用程序名称=MyAppName到连接字符串。程序集名称自动生成的值可能超过某些限制

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


尝试添加
Pooling=False,并检查这是否解决了应用程序重新启动时重复连接的问题。

因此,这个问题继续困扰着我,似乎是我的家庭网络(我是一名远程开发人员)和通过VPN访问的工作网络的滞后造成的。我对工作网络上的服务器有100毫秒的平均ping时间

真正奇怪的是,连接字符串连续几个月没有出现问题,然后突然停止。当时,应用程序名称值类似于Application Name=“MyProgram.DAL.Culture=en,PublicKeyToken=1A1A1A1A,Version=1.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;
    }

对我来说,诀窍是增加连接字符串的超时时间,因为通过vpn连接需要很长时间才能建立连接。您可以通过添加;连接超时=值

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

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

看来你已经有60秒了,也许你需要更多


希望有帮助

> P>此问题可能与正在进行SSL检查的中间防火墙有关。 我建议您再次尝试使用另一个未进行SSL检查的连接,或者要求您的防火墙管理员为您连接的源和/或目标创建豁免


干杯

您正在使用sql server Express吗?我经常遇到这种情况,每当我在visual studio中看到表的内容时,我都无法重建。我发现,如果我从任务管理器中禁用SQL Server Windows NT-64位(我的情况是64位),我可以重建项目。@CodeWarrior当您连接到SQL Server时,您是否尝试过给commandTime=0@CodeWarrior是否可以检查有问题的Sql Server中当前有多少个连接。我相信信息在sys.connections中,如果您在Sql Server中看到该机器的spid,请杀死该spid。然后再次尝试连接。它应该在sys.processs中(kill spid命令应该终止该连接)也可以在完成连接时关闭连接,例如:使用(var connection=new SqlConnection()){}添加应用程序名称属性无效。网络设置没有更改(回想一下,这种情况发生在一个调试会话和下一个调试会话之间,最多一分钟的时间跨度,在此期间,我所做的只是点击VS中的停止按钮和启动/调试按钮。添加Pooling=false没有任何效果。确定。您能试着用登录名和密码而不是集成安全性连接吗?数据源=服务器是否由IP或Nam标识e?如果名称在本地主机文件中,则通过SQL身份验证连接也会出现问题。数据源是通过主机名连接的,主机名在主机中。通过IP地址连接也会出现问题。请记住,错误消息说明它已连接到数据库,并且在预登录过程中发生了错误dshake。在这种情况下,服务器的网络连接不应该是一个问题,因为它说它已成功连接到服务器。E-E-er…谢谢,但我不希望r
    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;
    }