121

ADO.Net 应用程序有时只能连接到本地网络上的另一台服务器。给定的连接尝试是成功还是失败似乎是随机的。该连接使用以下形式的连接字符串:

服务器=THESERVER\TheInstance;数据库=TheDatabase;用户ID=TheUser;密码=密码;

返回的错误是:

连接超时已过期。尝试使用登录前握手确认时超时时间已过。
这可能是因为登录前握手失败或服务器无法及时响应。
尝试连接到此服务器所花费的持续时间是 - [登录前] 初始化 = 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 的相同凭据会成功?

4

23 回答 23

104

事实证明,为 IPv4 地址启用了 TCP/IP,但没有为 IPv6 地址启用 TCP/IP THESERVER

显然,一些连接尝试最终使用了 IPv4,而另一些则使用了 IPv6。

为两个 IP 版本启用 TCP/IP 解决了该问题。

SSMS 工作的事实证明是巧合(最初的几次尝试可能使用了 IPv4)。稍后通过 SSMS 进行连接的一些尝试导致了相同的错误消息。

为其他 IP 地址启用 TCP/IP:

  • 启动 Sql Server 配置管理器
  • 打开节点 SQL Server 网络配置
  • 左键单击 MYSQLINSTANCE 的协议
  • 在右侧窗格中,右键单击 TCP/IP
  • 单击属性
  • 选择 IP 地址选项卡
  • 对于每个列出的 IP 地址,确保 Active 和 Enabled 都是 Yes。
于 2013-03-18T23:34:29.737 回答
44

我刚刚出现了同样的错误,这与最新一轮的 Microsoft 更新(09/02/2016)可疑地一致。我发现 SSMS 连接没有问题,而我的 ASP.NET 应用程序返回“尝试使用登录前握手确认时超时时间已过”错误

我的解决方案是在连接字符串中添加 30 秒的连接超时,例如:

ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"

在我的情况下,唯一受影响的连接是使用集成安全性的连接,并且我在连接之前模拟用户,使用 SQL 身份验证到同一服务器的其他连接工作正常!

2 个测试系统(单独的客户端和 Sql 服务器)同时受到影响,导致我怀疑微软更新!

于 2016-02-12T03:51:01.967 回答
20

我像 Eric 一样解决了这个问题,但做了一些其他的改变:

  • 启动 Sql Server 配置管理器
  • 打开节点 SQL Server 网络配置
  • 左键单击 MYSQLINSTANCE 的协议
  • 在右侧窗格中,右键单击 TCP/IP
  • 单击属性
  • 选择 IP 地址选项卡
  • 对于每个列出的 IP 地址,确保 Active 和 Enabled 都是 Yes。

  • 对于每个列出的 IP 地址,确保 TCP 动态端口为空且 TCP 端口 = 1433(或其他一些端口)
  • 打开 windows 防火墙并检查端口是否在传入连接中打开
于 2015-04-15T12:35:49.860 回答
14

我遇到了同样的问题,尝试从 Visual Studio 连接到本地网络中的服务器(通过 VPN),同时设置实体数据模型。
只能通过设置TransparentNetworkIPResolution=false连接字符串来解决。在 VS 添加连接向导中,您可以在“高级”选项卡中找到它。

于 2016-01-09T13:22:53.060 回答
6

连接到托管服务器时,我遇到了同样的握手问题。

我打开了我的网络和共享中心,并在我的无线网络连接上启用了 IPv6。

在此处输入图像描述

于 2013-09-20T10:33:40.703 回答
4

我通过启用 IPv6 并解除对入站端口 1433 的阻止,在 Windows Server 2012 和 SQL Server 2012 上修复了此错误。

于 2014-01-14T06:52:09.027 回答
3

在最近安装了一些 Windows 更新后(2017 年 8 月 7 日那一周),我使用 .NET Framework 3.5 构建的可执行文件在大约一半的时间内开始报告这些连接问题。

连接失败是由安装在目标计算机上的 .NET Framework 4.7 引起的(Windows 更新自动安装已打开) - https://support.microsoft.com/?kbid=3186539

卸载 .NET Framework 4.7 解决了连接问题。

显然,.Net Framework 4.6.1 - TransparentNetworkIPResolution 根据文章更新连接字符串有一个重大变化也解决了这个问题,而无需回滚框架版本。

于 2017-08-16T18:06:31.387 回答
2

我有同样的问题,通过在 SQL Server 配置管理器中打开/启用端口 1433 和 tcp/ip来解决它,然后重新启动服务器

在此处输入图像描述

于 2016-02-19T02:32:02.183 回答
2

在我们的案例中,由于可用性集群配置而出现问题。为了解决这个问题,我们必须MultiSubnetFailover在连接字符串中设置为 True。

有关MSDN的更多详细信息

于 2019-04-01T15:12:36.043 回答
2

这是OP中错误的另一种解决方案......有很多解决方案,因为有很多原因。

我已经安装了 MSSql 2019 的开发者版。默认情况下,它的安装是锁定的……如果它只是在你的开发机器上,它将运行良好。如果您将其安装在开发盒以外的机器上,则需要更新防火墙规则。

默认情况下...“MS SQL Server”的防火墙配置文件是私有的

您可能需要启用公共和/或域配置文件。仅当您在域上进行身份验证时才使用域。
Windows 防火墙配置文件
防火墙配置文件

另外...要启用所有 IP 地址(如在接受的答案中),您需要做的就是

在 TCP/IP 属性上将“全部侦听”设置为是

TCP/IP 属性选项
TCP/IP 属性选项

于 2021-06-04T15:29:16.117 回答
2

在您像我一样浪费更多时间解决问题之前,请尝试重新启动您的 Windows 机器。在应用所有其他解决方案后为我工作。

于 2019-02-28T14:00:48.243 回答
1

在我的情况下,所有选项都已经存在。

通过增加 Connection Time-out = 30 来解决它。SQL Server 管理工作室

于 2017-04-26T08:10:03.027 回答
1

在做任何激烈的事情之前先尝试简单的 SQL Server 重启。可能会修复它。它对我有用

于 2019-04-30T11:34:11.667 回答
1

通过阻止/黑名单试图暴力破解用户帐户的 IP 地址解决了这个问题。检查您的 SQL 访问日志中是否有大量失败的登录尝试(通常是“sa”帐户)。

于 2017-07-06T21:22:09.377 回答
1

不幸的是,我在 Visual Studio 中安装了本地 SQL Server 时遇到了问题,这里的许多解决方案都不适合我。我所要做的就是重置我的 Visual Studio,方法是:

控制面板 > 程序和功能 > Visual Studio 安装启动器

然后点击更多按钮并选择修复

之后,我能够访问我的本地 SQL Server 并使用本地 SQL 数据库。

于 2019-10-25T16:12:44.983 回答
1

尽管以前接受了答案,但在此处添加响应。因为我的场景被确认为 DNS。更具体地说,登录前握手期间的 dns 超时。通过从 DNS 名称更改为 IP 地址(或使用 Hosts 文件条目),您可以绕过该问题。尽管以失去自动 ip 解析为代价。

例如,即使将连接字符串的超时值设置为 60 整整一分钟,它仍然会在尝试的几秒钟内发生。这导致人们质疑为什么它会在指定的超时期限之前超时?域名系统。

于 2020-07-06T19:56:25.473 回答
0

对我来说,事实证明 Windows 服务器中的防火墙阻止了端口 1433,这是默认的 sql 服务器端口。所以添加一个入站规则来接受这些连接对我来说是个窍门。

于 2018-09-12T22:14:58.450 回答
0

要跟踪“连接超时”错误,请确保:

有关详细信息,请检查连接超时已过期。尝试使用登录前握手确认时超时时间已过

于 2017-01-30T20:43:22.253 回答
0

在 C# 中,这让我发疯,它在我的部分代码中工作,并在一个特定区域使用相同的单例失败。事实证明,我正在使用模拟来读取文件,并且我正在使用使用提升权限的“受信任连接”调用 SQL 连接。该提升权限的用户无权访问 SQL DB,因此仅在该方法上失败。我把电话移到了模拟之外,之后效果很好。

于 2021-08-03T21:37:44.917 回答
0

我遇到了同样的问题,但我使用静态 IP 地址连接到远程数据库。所以上述解决方案都没有解决我的问题。

我未能为我正在使用的安全登录添加正确的用户映射,因此我的解决方案只是确保将用户映射设置设置为访问我的数据库。

于 2016-11-29T03:21:51.717 回答
0

我在进行 SharePoint 2010 到 2013 迁移时遇到了这个问题。我怀疑这是因为数据库服务器位于防火墙的另一侧,它不路由 IP6,所以它尝试使用 IP6 并在连接到数据库时失败。

我认为这个问题现在已经解决了。错误似乎已经停止。我所做的只是为 SharePoint 服务器上的网络适配器禁用了 IP6(通过取消选中它)。

于 2016-05-04T20:12:34.500 回答
0

就我而言,Persist Security Info=true连接字符串中带有用户名和密码的参数导致了问题。去掉参数或设置即可false解决问题。

于 2019-04-25T02:27:30.547 回答
0

我有确切的问题,尝试了几个soultion没有工作,最后重新启动系统,它工作正常。

于 2019-12-02T11:39:10.020 回答