在标记为重复之前请完整阅读。
在我调试的项目中,我收到一个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;
}
传递的连接字符串是在应用程序中的另一个 SqlConnectionStringBuilder 输出的。该连接字符串类似于:"Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"