与服务器成功建立连接,但在登录前握手期间发生错误

Posted

技术标签:

【中文标题】与服务器成功建立连接,但在登录前握手期间发生错误【英文标题】:A connection was successfully established with the server, but then an error occurred during the pre-login handshake 【发布时间】:2011-03-17 06:13:43 【问题描述】:

当我尝试从本地环境连接生产数据库时出现以下错误。

我之前可以连接生产数据库,但突然出现以下错误,知道吗?

。 (提供者:TCP Provider,错误:0 - 句柄无效。)

我试图在本地 PC 上运行 asp.net 网站,该网站具有生产数据库的连接字符串,以下是我在本地环境中遇到的错误的堆栈跟踪。

>    at MyWebsiteDAL.clsForumQuestion.SelectAll(Int32 CurrentPageIndex, Int32 PageSize) in D:\EDrive\My WebSites\MyWebsite\MyWebsite\MyWebsiteDAL\clsForumQuestion.cs:line 821
       at CodeConnect.Default.Page_Load(Object sender, EventArgs e) in D:\EDrive\My WebSites\MyWebsite\MyWebsite\MyWebsite\Default.aspx.cs:line 100
       at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
       at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
       at System.Web.UI.Control.OnLoad(EventArgs e)
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

知道这里可能出了什么问题吗?

【问题讨论】:

您连接到哪个 DBMS? 您可以从本地 PC 与 SSMS 连接吗?这个问题最好在 serverfault.com 上问 是的,我可以连接。我观察到的东西突然开始起作用了。 我相信这个问题确实属于 ***(而不是 ServerFault),因为导致错误的根本问题是 Visual Studio 中的 Asp.net Cassini。停止所有现有的 Cassini (WebDev.WebServer.exe) 实例并重新运行该应用程序对我有用。 @MikeTeeVee 我在一个简单的 WinForm 应用程序中遇到了同样的问题。不涉及卡西尼。 【参考方案1】:

解决方案

1) 清理您的 VS.Net 解决方案

2) 重建项目。

3) 重置 IIS

4) 再次运行项目。

基本上这解决了我的问题,但在我的情况下,我没有收到这个错误,突然我的本地环境开始给我上述错误,所以这个技巧可能对我有用。

【讨论】:

我也有类似的问题(本地主机也是)。关键点似乎可能是第 3 点。我似乎需要做的就是杀死 VS WebServer (Cassini) 的实例并重建并按 F5。这为我解决了。感谢您的回答。 (您应该考虑将其标记为解决方案) 这个解决方案也对我有用。我也使用 VS Web Server (Cassini) 而不是 IIS,就像 Amadiere 一样。 这听起来更像是一种解决方法而不是修复方法。我想知道真正的问题是否与连接池有关。 今天又遇到了。您需要做的就是从管理员命令提示符运行 iisreset。 可以通过为根本原因分析提供一些可能的方向来改进这个答案。变通办法很有价值,但了解为什么会发生这种情况以及变通办法为何有效会更有用。【参考方案2】:

在我的例子中,这个错误发生在 dot net core 和 Microsoft.Data.SqlClient 上。 解决方案是在连接字符串的末尾添加;TrustServerCertificate=true

【讨论】:

谢谢你救了我:) 这是使用自签名证书时的情况【参考方案3】: 保存您的工作, 关闭 Visual Studio,然后 重新打开您的项目

这对我有用。

【讨论】:

这对我也有用,但我经常发现在重新启动时煮咖啡会带来很大的不同。 我遇到了类似的问题,但使用的是节点服务器。我在 ubuntu VM guest 上运行节点服务器并从 Windows 10 VM 主机访问。暂停并保存虚拟机,然后重置 Windows 10 主机,然后打开虚拟机备份工作,所以我认为这是 Windows 的问题,而不是本地服务器的问题。但是,我刚刚尝试重置本地节点服务器,并且也修复了它......所以谁知道,哈【参考方案4】:

运行以下命令对我有用:

netsh Winsock reset

见于https://serverfault.com/a/487139/250527

【讨论】:

这解决了我的问题。我欠网络人的午餐,因为我把他扔到公共汽车下。 仅供参考,此reset 需要重新启动系统。 2.5 小时后,这救了我的培根。非常感谢!【参考方案5】:

我在运行一些非常消耗内存的进程时遇到了这个错误。当系统开始内存不足时,我开始注意到这种错误。 为了更好地利用 RAM,我不得不更改算法。

需要注意的是,虽然有些线程抛出了这个异常,但有些线程抛出了:

System.Data.SqlClient.SqlException (0x80131904):连接超时。尝试使用登录前握手确认时超时时间已过。这可能是因为登录前握手失败或服务器无法及时响应。尝试连接到此服务器所花费的持续时间是 - [登录前] 初始化 = 43606;握手=560; ---> System.ComponentModel.Win32Exception (0x80004005): 等待操作超时

更改系统后,这两个问题都消失了,因此它可以使用更少的 RAM 运行。

【讨论】:

已确认。我在笔记本电脑上使用 parallel.foreach 从 C# 在 SQL Server 上运行密集处理。我的内存使用量达到了最大值。在我收到此错误之前,计算机几乎无法使用大约 15 分钟。 我将 MsSql 作为容器运行,并将其限制为 1GB 内存。当我将限制提高到 2GB 时它起作用了。谢谢楼主?‍♂️【参考方案6】:

我有同样的问题,我将会话数据存储在数据库中,连接字符串中包含 Encrypt=True,我假设它告诉 sql 客户端安全地连接到服务器( SSL) 模式,删除它有帮助!

【讨论】:

如果您要使用 Windows Azure SQL 数据库,此标志将添加到您的连接字符串中。我很确定它也会用于其他 PaaS/IaaS/Server 提供商。 AzureSQL 要求加密 true blogs.msdn.microsoft.com/buckwoody/2012/03/06/…【参考方案7】:

您可能需要检查几件事:

    您的生产服务器允许远程连接。 (可能有人将其关闭,尤其是如果您有 DBA)

    检查您的连接字符串。有时,如果您使用 IP 地址或服务器名称,这将导致此错误。两个都试试。

【讨论】:

【参考方案8】:

在我的情况下是:

Persist Security Info=True;

在我需要删除的连接字符串中。一旦我这样做了,我就不再有问题了。

【讨论】:

【参考方案9】:

如Ricardo的回答中所述,

netsh Winsock reset

对我有用,

PS 如果您安装了 Internet 下载管理器或此类更改您 IP 设置的程序,则在重新启动计算机时运行此命令后 IDM 将要求更改设置,在这种情况下设置为 NO 并然后运行您的应用程序,它将正常工作。

希望

【讨论】:

【参考方案10】:

我遇到了完全相同的问题,但代码库或服务器没有任何变化。原来是 DB 服务器以 100% CPU 运行,而 SQL Server 缺少任何 CPU 时间,导致超时。

【讨论】:

SQL Server 是数据库服务器,对吧?还是数据库服务器只是运行 SQL Server 的一般系统?【参考方案11】:

我有一个类似的问题,我无法连接到数据库并尝试了这里的建议。

归根结底,这对我有用:

使用 SQL Server 配置管理器工具在 SQL Server 客户端计算机上启用 TCP/IP 和/或命名管道协议。

    单击开始,指向所有程序,然后单击 SQL Server 配置管理器。 单击展开 SQL Server 网络配置,然后单击客户端协议。 右键单击 TCP/IP 协议,然后单击启用。 右键单击命名管道协议,然后单击启用。 如果出现提示,请重新启动 SQL Server 服务。

我仍然不确定为什么或何时禁用此功能。

【讨论】:

【参考方案12】:

尝试了上述大部分方法,但没有任何效果。然后关闭了***软件(Nord***),一切都很好。

【讨论】:

谢谢!你拯救了我的一天:)【参考方案13】:

我重新启动了 SQL Server (Sharepoint) 服务,它解决了问题。

【讨论】:

【参考方案14】:

对我来说,解决方案是杀死僵尸 IIS express 工作进程。

例如在任务管理器中找到并结束任务。

【讨论】:

【参考方案15】:

我遇到了同样的问题,并且对建议的修复方法没有任何帮助。然后我遇到了this article,并看到了来自 Mirrh 关于一个名为 Sendori 的程序阻止 LSP 的评论。不知道它是如何进入我的计算机的,但它确实存在,并且将其删除解决了问题。

如果文章不起作用,请检查您的程序并在看到时卸载 Sendori。

【讨论】:

【参考方案16】:

这里有同样的问题,这里没有列出任何答案,我在网上也找不到任何解决方案。这个问题在我的开发 PC 上应用 Windows 10 周年更新后不久就开始了,并且只影响了我的旧 SQL Server 2005 实例。我无法通过我的 Web 应用程序甚至使用 Sql Management Studio 连接到实例。

对于它的价值,这就是为我解决它的原因:

    打开 SQL Server 配置管理器(取决于您运行的 SQL Server 版本):

    C:\Windows\SysWOW64\SQLServerManager.msc C:\Windows\SysWOW64\SQLServerManager10.msc 或 C:\Windows\SysWOW64\SQLServerManager12.msc 或 等

    选择 SQL Server 服务

    找到有问题的服务并查看属性

    就我而言,例如 SQL Server (SQL2005)

    在“登录”选项卡中,将“内置帐户”更改为“网络服务”

这几乎就是这个随机解决方案所说的:http://www.kutayzorlu.com/operating-systems/linux-unix-redhat-debian-ubuntu-opensuse-centos/general-server-administrating/error-fixed-a-connection-was-successfully-established-with-the-server-but-then-an-error-occurred-during-the-pre-login-handshake-12405.html

我无缘无故选择了网络服务。我的已经配置为使用本地系统。这种安全性对我来说并不重要,因为它只在我的本地开发机器上存在问题,只能在本地访问。我不知道为什么会这样,但确实如此。

【讨论】:

【参考方案17】:

就我而言,当我想访问远程数据库时遇到了错误。但是,我通过启动 SQL Server Browser 服务解决了这个问题。

【讨论】:

【参考方案18】:

很多天都遇到同样的问题。我必须在我的核心项目中明确添加 TLS1.2 支持以解决此错误,并且它运行良好。 (ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;)

查看以下链接了解更多详情(感谢作者 Usman Khurshid) https://www.itechtics.com/connection-successfully-established-error-occured-pre-login-handshake/

【讨论】:

【参考方案19】:

如果您要连接到旧的 SQL Server:

从 System.Data.SqlClient.SqlConnection 切换到 System.Data.OleDb.OleDbConnection

使用 OleDb 连接字符串:

<connectionStrings>
<add name="Northwind" connectionString="Provider=SQLOLEDB.1; Data Source=MyServer; Initial Catalog=Northwind;  Persist Security Info=True; User ID=abc; Password=xyz;" providerName="System.Data.OleDb" />
</connectionStrings>

【讨论】:

【参考方案20】:

在过去的一个月里,我尝试了很多解决方案,但都没有奏效。问题是生产数据库位于 *** 中,并且 ISP 提供商以某种方式认为 HTTP 连接不安全。但是,我能够从 SSMS 连接到同一个生产数据库(使用 TCP)。

我的解决方案:将手机用作热点并使用移动数据而不是办公室/家庭 Wi-Fi。

【讨论】:

在我的情况下也是如此。谢谢!【参考方案21】:

在我的例子中,从我的 API 到数据库的连接在我的本地机器上运行时工作正常,这个错误仅在使用基本映像的 docker 容器中运行 .NET Core 5 API 应用程序时发生:mcr.microsoft.com/dotnet/aspnet:5.0。问题是 SQL Server 和我们的一个依赖项之间的 TLS 版本不一致。修复方法是在 API Dockerfile 中添加以下行,降低 TLS 的安全级别:

运行 sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf

这取自this article,其中建议了上述RUN 命令,这解决了我的问题。建议修复的直接链接是here。

【讨论】:

【参考方案22】:

有同样的问题,原因是使用 .NET 2.0 框架编译的 BCrypt.Net 库,而使用它的整个项目是使用 .NET 4.0 编译的。如果症状相同,请尝试下载 BCrypt source code 并在 .NET 4.0 的发布配置中重建它。在我完成之后,“登录前握手”工作正常。希望它可以帮助任何人。

【讨论】:

【参考方案23】:

我遇到了这个错误,并在这里做了你们的所有建议,但对我的错误没有任何影响。

我抓住了罪魁祸首:如果您在系统中使用*.ini 文件,您可能需要检查那里输入的服务器名称,并确保它与您的 web.config 连接字符串中的名称相同。

【讨论】:

【参考方案24】:

就我而言,数据库服务器中的Re-enabling TLS 1.0 解决了这个问题。

【讨论】:

这并不是真正的解决方案。我不会反对它,因为在开发环境中它可能会帮助某人,但这会暴露出严重的安全威胁。【参考方案25】:

就我而言,这是托管 .Net Core 3.1 应用程序的 Raspberry Pi 向带有 MSSQL 的 Windows Server 2012 请求的 TLS 协议不匹配。我在 Windows Server 端尝试了很多 TLS 协议版本的更改,但没有任何效果。我终于找到了https://github.com/dotnet/SqlClient/issues/126这个帖子,表示修改客户端,即更新RPi端的/etc/ssl/openssl.cnf,对我来说效果很好。

【讨论】:

【参考方案26】:

对我来说,我在访问本地(主机)计算机上的数据库的 HyperV 虚拟机上发生了这种情况。基本上一切正常,但重启后会出现一些奇怪的情况,即虚拟机应用程序开始出现此错误。网络层中有一些东西变得非常混乱。但是,我发现如果我从主机服务器 ping 虚拟服务器,它似乎可以解决问题(不知道究竟是为什么)。但这可能会对某人有所帮助。

【讨论】:

【参考方案27】:

要检查的另一件事是您是否将 SQL Server 网络配置设置为“强制加密”。如果这样做,除非您为加密连接执行必要的客户端咒语,否则您将收到此错误。

【讨论】:

以上是关于与服务器成功建立连接,但在登录前握手期间发生错误的主要内容,如果未能解决你的问题,请参考以下文章

在C#里连接SQL 2008 报错:已成功与服务器建立连接 但登录前握手期间发生错误 网络名不可再用

已成功与服务器建立连接,但是在登录前的握手期间发生错误。

已成功与服务器建立连接,但是在登录前的握手期间发生错误

已成功与服务器建立连接,但是在登录前的握手期间发生错误。

已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的

已成功与服务器建立连接,但是在登录前的握手期间发生错误。帮我看看是网站问题还是我电脑问题啊?