我正在使用 ASP.NET Core 3.1 和 Entity Framework Core 3.1 开发 Azure App Service API
我目前有一个与 Azure SQL 服务器实例的数据库连接,工作正常。现在我需要向本地本地 SQL Server 添加额外的数据库连接,因此我在门户中设置了 Azure 混合连接,并在本地本地 Windows Server 2019 上安装了混合连接管理器和 SQL Server 2017. 本地服务器上的混合连接管理器和 Azure 混合连接屏幕都显示“已连接”。但是,在调试我的应用服务时出现以下错误:
建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:TCP 提供者,错误:0 - 不知道这样的主机。)
我已经阅读了很多关于这个主题的帖子,人们似乎遇到了类似的问题,他们谈论使用 FQDN 作为主机名,我假设他们指的是 Azure 中混合连接的“端点主机”属性。
我对 FQDN 有点困惑,因为它们似乎在我读过的帖子中暗示 FQDN 需要在Internet DNS 上可解析,这就是为什么我收到“不知道这样的主机”错误的原因。
但是,我认为 Azure 中混合连接的重点是允许访问本地(如不可公开访问)数据库。我没有在我的 ISP 的 DNS 中为我的本地 SQL Server 注册主机名。我真的需要这样做吗?
例如,如果我的公共域名是“mycompany-online.com”,但我的 Windows 域的内部域名是 mycompany.local,而我本地网络上的 Windows Server 2019 主机名称为“DEV-SQLSVR-1” ,我的“端点主机”名称是否应该是“DEV-SQLSVR-1.mycompany.local”、“DEV-SQLSVR-1.mycompany-online.com”(假设我以某种方式将 DEV-SQLSVR-1 注册为主机名或 CNAME在我的公共 DNS 中。见注 1),或者只是“DEV-SQLSVR-1”?
注意 1:我是否真的需要注册主机名“DEV-SQLSVR-1”,我的 ISP DNS 指向...究竟是什么,因为我真的不希望我的本地 SQL 服务器面向公众?
另外,ASP.NET Core 3.1 中的连接字符串应该是什么样的?目前,我的 appsettings.json 中有以下内容;
"ConnectionStrings": {
"HcConnectionString": "Server=dev-sqlsvr-1,1433;Initial Catalog=MyDb;Persist Security Info=False;User ID=XXXX;Password=XXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"
}
作为记录,我断开了与 DEV-SQLSVR-1 端点主机的混合连接,并将其从托管混合连接管理器的服务器上的配置文件中删除。然后我使用 DEV-SQLSVR-1.mycompany.local 而不是 DEV-SQLSVR-1 设置了一个新的混合连接,认为这是 FQDN 所需要的。然后我编辑了我的连接字符串以使用“dev-sqlsvr-1.mycompany.local”,而不仅仅是“dev-sqlsvr-1”。尽管它还在本地服务器上的混合连接管理器和 Azure 中的混合连接中将新的混合连接显示为“已连接”,但在尝试在 Visual Studio 2019 中调试 API 时,我仍然遇到相同的错误。
一些额外的细节;
#1:在我的应用服务 API --> Startup.cs --> ConfigureServices 方法中,我使用以下内容为使用混合连接的 SQL Server 连接设置 EF Core DbContext:
services.AddDbContext<HcContext>(options =>
{
options.UseSqlServer(
Configuration.GetConnectionString("HcConnectionString"));
});
#2:我的本地 SQL 实例称为“SQL Server (MSSQLSERVER),如果这真的很重要的话。
#3:我可以从我的 DEV 工作站使用 Sql Server Management Studio 访问 SQL Server,同时连接到本地网络并使用 VPN 远程连接,所以我知道至少本地 SQL Server 上的防火墙属性正在工作。
[更新 1] 仅供参考:如果我通过 VPN 将我的 DEV 工作站连接到带有 SQL Server 的网络并在 Visual Studio 中本地运行 API,使用完全相同的连接字符串,它工作正常。所以我知道问题不在于 SQL Server / API 代码。
我在这里想念什么?