C# 登录前握手时出错
请阅读全文,然后将其标记为副本。 在我正在调试的项目中,我收到一个SqlException,上面说: 其他信息:已成功与服务器建立连接,但在预登录握手过程中发生错误。(提供程序:SSL提供程序,错误:0-等待操作超时。) 这发生在调试会话期间,其中前一个会话仅在几秒钟前执行,没有问题。由于初始异常,我无法连接到此项目中的数据库服务器在SqlConnection.Open()方法调用时引发异常。 背景 这不是我第一次收到这个。之前,我与它斗争了两周,最终启动了微软的支持票。在那个实例中,连接字符串上的ApplicationName属性太长(我们使用的是完全限定的程序集名称),缩短它可以缓解问题 这一次,有C# 登录前握手时出错,c#,.net,sql-server,database-connection,connection-string,C#,.net,Sql Server,Database Connection,Connection String,请阅读全文,然后将其标记为副本。 在我正在调试的项目中,我收到一个SqlException,上面说: 其他信息:已成功与服务器建立连接,但在预登录握手过程中发生错误。(提供程序:SSL提供程序,错误:0-等待操作超时。) 这发生在调试会话期间,其中前一个会话仅在几秒钟前执行,没有问题。由于初始异常,我无法连接到此项目中的数据库服务器在SqlConnection.Open()方法调用时引发异常。 背景 这不是我第一次收到这个。之前,我与它斗争了两周,最终启动了微软的支持票。在那个实例中,连接字符串
- 未提供ApplicationName值
- WinSocks处于默认状态
- 防病毒(ESET)已禁用,不是问题所在
- 在工作和非工作调试会话之间未安装任何内容
传入的连接字符串是从应用程序中其他位置的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;
}