与服务器成功建立连接,但在登录前握手期间发生错误
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 - 等待的