ADO.Net应用程序有时只能连接到本地网络上的其他服务器。给定连接尝试成功或失败似乎是随机的。连接使用以下形式的连接字符串:
Server = THESERVER \ TheInstance; Database = TheDatabase; User Id = TheUser;密码= ThePassword;
返回的错误是:
连接超时已过期。尝试使用登录前握手确认时超时时间已过 这可能是因为登录前握手失败或服务器无法及时响应 尝试连接到此服务器所花费的时间是 - [Pre-Login] initialization = 42030;握手= 0;
.NET应用程序是一个小型测试应用程序,它执行以下代码:
using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
conn.Open();
int rowCount = (int)cmd.ExecuteScalar();
}
TheTable 很小,只有78行。
但是,在.NET应用程序收到此错误的同一台计算机上,我可以使用SSMS和连接字符串中指定的用户ID /密码连接到THESERVER。
为什么连接可能会从ADO.Net应用程序失败,但是使用SSMS的相同凭据会成功?
答案 0 :(得分:86)
事实证明,对{IPv4}地址启用了TCP / IP,而不是THESERVER
的IPv6地址。
显然有些连接尝试最终使用IPv4而其他人使用IPv6。
为两个IP版本启用TCP / IP解决了这个问题。
SSMS工作的事实证明是巧合(前几次尝试可能使用IPv4)。稍后某些通过SSMS连接的尝试导致了相同的错误消息。
为其他IP地址启用TCP / IP:
答案 1 :(得分:25)
我刚刚遇到了同样的错误,它与最新一轮的微软更新(09/02/2016)产生了可疑的结果。我发现SSMS连接没有问题,而我的ASP.NET应用程序返回“尝试使用登录前握手确认时出现超时时间”错误
我的解决方案是在连接字符串中添加30秒的连接超时,例如:
ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"
在我的情况下,唯一受影响的连接是使用集成安全性的连接,我在连接之前冒充用户,使用SQL身份验证的同一服务器的其他连接工作正常!
2个测试系统(单独的客户端和Sql服务器)同时受到影响,导致我怀疑微软更新!
答案 2 :(得分:16)
我解决了像埃里克这样的问题,但还有其他一些变化:
AND
答案 3 :(得分:6)
我遇到了同样的问题,尝试从Visual Studio连接到本地网络中的服务器(通过VPN),同时设置实体数据模型。
管理只能通过在连接字符串中设置TransparentNetworkIPResolution=false
来解决。
在VS添加连接向导中,您可以在“高级”选项卡中找到它。
答案 4 :(得分:5)
连接到托管服务器时,我遇到了相同的握手问题。
我打开了我的网络和共享中心,并在我的无线网络连接上启用了IPv6。
答案 5 :(得分:3)
使用.NET Framework 3.5构建的可执行文件在最近安装了一些Windows更新(2017年8月7日这周)之后,大约有一半时间内开始报告这些连接问题。
连接失败是由安装在目标计算机上的.NET Framework 4.7引起的(Windows更新自动安装已开启) - https://support.microsoft.com/?kbid=3186539
卸载.NET Framework 4.7解决了连接问题。
显然,.Net Framework 4.6.1发生了重大变化 - TransparentNetworkIPResolution 根据文章更新连接字符串也解决了问题,而无需回滚框架版本。
答案 6 :(得分:2)
我通过启用IPv6并取消阻止入站端口1433在Windows Server 2012和SQL Server 2012上修复了此错误。
答案 7 :(得分:1)
这是解决 OP 中错误的另一种解决方案...有很多解决方案,因为有很多原因。
我已经安装了 MSSql 2019 的开发者版。 默认情况下,它的安装是锁定的……如果它在您的开发机器上运行,它将正常运行。如果您将它安装在除开发箱之外的机器上,您将需要更新防火墙规则。
<块引用>默认情况下...“MS SQL Server”的防火墙配置文件是私有的
您可能需要启用公共和/或域配置文件。仅当您在域上进行身份验证时才使用域。
Windows FireWall Profiles
此外...要启用所有 IP 地址(如已接受的答案),您需要做的就是
<块引用>在 TCP/IP 属性上将“全部侦听”设置为“是”
答案 8 :(得分:1)
答案 9 :(得分:1)
像我一样,在浪费更多时间解决问题之前,请尝试重新启动Windows计算机。应用所有其他解决方案后为我工作。
答案 10 :(得分:1)
答案 11 :(得分:0)
在我们的情况下,由于可用性群集配置而出现问题。要解决此问题,我们必须在连接字符串中将MultiSubnetFailover
设置为True。
有关MSDN的更多详细信息
答案 12 :(得分:0)
在 C# 中,这让我发疯,它在我的部分代码中工作,但在使用相同单例的特定区域失败。事实证明,我正在使用模拟来读取文件,并且我正在使用使用提升权限的“可信连接”调用 SQL 连接。该提升权限的用户无权访问 SQL 数据库,因此它仅在该方法上失败。我将呼叫转移到模拟之外,之后效果很好。
答案 13 :(得分:0)
尽管先前已接受答案,但仍在此处添加答复。 由于我的情况被确认为DNS。更具体地说,登录前握手期间的dns超时。 通过从DNS名称更改为IP地址(或使用“主机”文件条目),可以避免此问题。尽管以失去自动IP解析为代价。
例如,即使将连接字符串的超时值设置为一整分钟的60,它仍然会在尝试的几秒钟内发生。哪个使人质疑为什么它会在指定的超时期限之前超时? DNS。
答案 14 :(得分:0)
我遇到了确切的问题,尝试了几次灵魂修复都不起作用,最后重新启动了系统,一切正常。
答案 15 :(得分:0)
上次Microsoft Windows更新后,我遇到了一个可以自动解决的问题,有人会遇到同样的问题吗?
答案 16 :(得分:0)
不幸的是,我在Visual Studio中安装了本地SQL Server时遇到了问题,在这里许多解决方案对我来说都不可行。我要做的就是通过以下步骤重置Visual Studio:
控制面板>程序和功能> Visual Studio安装启动器
,然后点击更多按钮,然后选择修复
之后,我可以访问本地SQL Server并使用本地SQL数据库。
答案 17 :(得分:0)
尝试先进行简单的SQL Server重新启动,然后再执行任何大动作。可能修复它。对我有用
答案 18 :(得分:0)
就我而言,连接字符串中包含用户名和密码的参数Persist Security Info=true
引起了问题。
删除参数或将其设置为false
即可解决问题。
答案 19 :(得分:0)
对我来说,事实证明Windows服务器中的防火墙阻止了端口1433,这是默认的sql服务器端口。因此,添加入站规则以接受这些连接对我来说是成功的秘诀。
答案 20 :(得分:0)
通过阻止/黑名单试图暴力破解用户帐户的IP地址解决了这个问题。检查SQL访问日志以查找大量失败的登录尝试(通常用于&#39; sa&#39;帐户)。
答案 21 :(得分:0)
&#34;连接超时已过期&#34;错误通常发生在以下情况
要根据上述原因检查如何跟踪此错误,请检查Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgment
答案 22 :(得分:0)
我遇到了同样的问题,但是我使用静态IP地址连接到远程数据库。所以上述解决方案都没有解决我的问题。
我无法为我正在使用的安全登录添加正确的用户映射,因此我的解决方案只是确保将用户映射设置设置为访问我的数据库。
答案 23 :(得分:0)
我在执行SharePoint 2010到2013迁移时出现此问题。我怀疑这是因为数据库服务器位于防火墙的另一端,它没有路由IP6,它正在尝试使用IP6并在连接到数据库时失败。
我认为这个问题现在已经解决了。这些错误似乎已经停止了。我所做的是我只是为SharePoint服务器上的网络适配器禁用了IP6(通过取消选中)。