将 .net 应用程序移动到新服务器时出现 SQL Server 连接错误

Posted

技术标签:

【中文标题】将 .net 应用程序移动到新服务器时出现 SQL Server 连接错误【英文标题】:SQL Server connection errors when moving .net app to new server 【发布时间】:2020-05-07 23:22:52 【问题描述】:

我正在尝试迁移到 Server 2019 机器的 Server 2008 机器上的许多 .NET Web 应用程序,其中一些在移动它们后给我连接到另一台服务器上的 SQL Server 2016 实例的问题.

我得到的错误是

System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:25 - 连接字符串无效)---> System.ComponentModel.Win32Exception (87):参数不正确

这是一个 .NET Core 2.2 Web 应用程序。 (安装在服务器上的.net core 2.2服务器包)连接字符串就像 “服务器=mysqlserver\myinstance,3050;数据库=Idea;Trusted_Connection=True;” 并且正在使用 Entity Framework/DbContext 进行连接。

IIS 中的应用程序为此应用程序创建了一个应用程序池,设置与在旧服务器上运行时相同:无托管代码,身份设置为域用户“域\用户”。

从新的应用服务器 Ping 到数据库服务器正常工作。在新服务器上以域用户身份运行 SSMS 可以正常连接数据库,并且可以通过管理工作室查看数据。

所以我不知道 Server 2019 中尝试连接 SQL Server 的方式是否有什么不同?几天来我一直在努力解决这个问题。 .NET 4.0 应用在尝试连接到同一实例上的其他数据库时也会遇到同样的错误。

奇怪的是,其他一些应用程序运行良好,连接到不同服务器上的不同 SQL 2016 实例,但它们也是不同的 .net 版本,如较旧的 .NET 4.0 Web 应用程序,但它们作为应用程序池运行每个应用程序都有不同的域帐户。

似乎此服务器上的所有 .NET Core 或 .net 4.0 Web 应用程序都无法从该服务器连接到这个数据库实例,但在旧的 Web 应用程序服务器上它们工作正常。

还有什么我可以检查的想法吗?

编辑:我发现错误实际上是在连接到新的 SQL Server 时,即使从旧的应用程序服务器它仍然会收到相同的错误。我在这个应用程序中有 2 个连接,所以我以为是第一个,但实际上是第二个。所以这更多地与新的 SQL 服务器实例有关。同样,来自 SSMS 的连接适用于此用户,但不能来自网络应用程序。

Edit2:经过更多测试,如果有 Server 2019 混合使用,那肯定是可以做的。从 2019 应用服务器到 2019 数据库服务器失败。从 2008 应用服务器到 2019 数据库服务器失败。从 2019 应用服务器到 2016 数据库服务器失败。从 2008 应用服务器到 2016 数据库服务器成功。

编辑 3:我觉得我在这里要疯了。其中一个应用程序,我尝试将 ASPNETCORE_ENVIRONMENT 更改为 Development 以便我可以在屏幕上看到更详细的错误,因此我将 appsettings.Development.json 设置为与 appsettings.Production.json 完全相同,然后连接正常!将其切换回生产环境再次出现错误。整个文件是完全相同的文本。这有什么意义呢?我什至尝试将环境变量显式设置为生产,而不是让它作为默认值。

编辑 4:我已经解决了我现在遇到的一半问题。 无论出于何种原因,我一开始从其中一个电子表格中复制的连接字符串中包含疯狂的隐藏字符,这就是为什么它说 sql server 不存在的原因。 我在任何编辑器中都看不到它们,只有通过 VS Code 比较才发现它,说行不同但没有看到任何差异,我将它分成块并找到了位置。当我们在写字板中打开它时,我们发现这是唯一会显示它的地方,见下文。

【问题讨论】:

如果是本地实例连接则移除端口 它不是本地的,这是正确的端口,与旧应用服务器的连接字符串中的端口相同。 好的,那你可能得把你的ip加入白名单了。 尝试创建 SQL 登录并检查此链接***.com/questions/11132003/… 我们正在尝试避免 SQL 登录并仅使用域用户。 【参考方案1】:

我很确定解决方案是从连接字符串中删除实例名称...

"Server=mysqlserver,3050;Database=Idea;Trusted_Connection=True;"

参考这些问题question1 & question2

“指定端口时不必指定实例名称。”

【讨论】:

Hmmm bummer... 如果这看起来是一个愚蠢的建议,我很抱歉,但对于 .Net Core 应用程序,连接字符串通常在应用程序目录内的 JSON 文件中设置,可能是 appsettings.json 或一个类似的 JSON 文件,也许你正在修改 IIS 中的连接字符串,这将不起作用。 我在 appsettings.json 中更改它。 嗯,你说它给了你同样的错误......你完全确定这是同样的错误吗?您发布的错误说连接字符串无效)---> System.ComponentModel.Win32Exception(87):参数不正确所以,在原始错误中,它说连接字符串无效,这可能是由实例名称引起的......也许现在它给出了另一个错误? 完全相同的错误,没有实例名称。此外,我在任何其他应用程序中同时使用实例名称和端口都没有遇到过问题,这种方式一直运行良好。 好吧,根据您所做的编辑,我会确保端口 3050 已打开...请记住 SQL Server 安装的默认端口是 1433,并且 SMSS 将尝试连接到除非您另有说明,否则该端口... 最后一个想法,您可以使用 Nmap (nmap.org) 扫描服务器的端口并检查端口 3050 是否打开。【参考方案2】:

问题在于连接字符串中的隐藏字符。请参阅我的编辑 4。剩下的其他问题无关紧要。

【讨论】:

【参考方案3】:

尝试使用您在 IIS 中配置应用程序时使用的相同 AppPool 名称在数据库中创建用户。

这是在数据库中创建用户的“如何”: https://engram404.net/grant-sql-permissions-to-iis-apppool-user/

它对我有用。

否则,这就是它发生的“原因”: 您在您的 connectionString 中告诉它将使用受信任的连接 "Trusted_Connection=True;"

如果您不想像前面描述的那样创建用户,您应该删除Trusted_Connection=True; 并像这样使用您的连接字符串:

Server=mysqlserver\myinstance,3050;Database=Idea;User Id=SetYourUser;Password=SetYourPassword"

【讨论】:

我尝试使用用户 ID 并按照您的建议传递用户,但我得到了同样的错误。我认为错误可能是在 Server 2019 级别阻止了某些东西? 我不这么认为...您是否按照我提到的第一步在数据库中创建了用户?这对我有用。否则,您可能想尝试将您的环境配置为 Development 以查看屏幕上是否会显示更多详细信息【参考方案4】:

我知道你碰巧解决了这个问题,但仍然..

无法使用 System.Data.SqlClient 连接到 MySQL 数据库 - 它是为 SQL 数据库配置的,而不是 MySQL

您可以找到 MySQL 数据连接器Here.(您也可以从Nuget 下载)

如果您是从Nuget 下载的,请跳过此步骤。


下载包后,您可以将其作为参考添加到您的项目中,方法是在解决方案资源管理器中右键单击References 项,然后单击Add Reference... - 参考管理器 窗口随即打开。单击左侧菜单中的Browse 项,然后单击Browse 按钮,然后导航到保存包的目录。


现在,在成功下载并安装包后,将这一行添加到您的代码中:

using MySql.Data.MySqlClient;

使用MySql.Data.MySqlClient; 连接到您的MySQL 数据库的正确语法是:

string connectionInfo = @"Server=localhost;Database=your_database;User ID=root;Password=123456";

因此,总体而言,您的代码如下所示:

    using(MySqlConnection con = new MySqlConnection(connectionInfo))
    
        con.Open();
        MessageBox.Show("Successful Connection!");
    

(代码/部分答案来源于here.)

我希望我可以帮助其他人解决这个问题:)

【讨论】:

谢谢,但我没有使用 MySQL,我正在连接到 MS SQL Server,如果不清楚,请见谅。 我的错...... 我想我读错了你的问题:D 抱歉!

以上是关于将 .net 应用程序移动到新服务器时出现 SQL Server 连接错误的主要内容,如果未能解决你的问题,请参考以下文章

将代码从一个类移动到新类时出现问题?

将 XAMPP 文件夹移动到新计算机,现在在尝试启动 MySQL 时出现“(XAMPPErrorDomain error 1.)”

使用新的 ASP.NET Core 应用程序连接到 SQL Server 时出现问题

对 Fusion Table 进行 SQL 查询时出现 403 错误

尝试将多个函数聚合到新列时出现意外的 KeyError Pandas

尝试实现登录时出现 ArgumentException(ASP.NET Core 项目)