【问题标题】:.NET Core on Azure can't connect to SQL Server DatabaseAzure 上的 .NET Core 无法连接到 SQL Server 数据库
【发布时间】:2020-08-21 22:29:36
【问题描述】:

我有一个在 Azure 上发布的 .NET Core API 后端。我还有一个在 Azure 上运行的 SQL Server 数据库,如果我在本地运行我的后端应用程序,它会成功连接到 online 数据库,读/写等工作正常。但是,在运行在线后端时,每个 API 调用都会导致 500 错误。查看日志时出现以下错误,可能导致 500:

Microsoft.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

因此,出于某种原因,托管在 Azure 上的后端无法访问此数据库。在我的在线数据库的 Azure 门户中,我已将后端的 IP 添加到防火墙异常中,并选中了“允许远程 Azure 连接到服务器”。

TLDR;在本地一切正常,在 Azure 上发布的版本无法连接/查找数据库。

编辑:已解决,感谢所有评论的人。 (特别感谢 Jason!) 解决方案是使用以下格式的连接字符串:

Data Source=tcp:servername.database.windows.net,1433;Initial Catalog=db;Persist Security Info=False;User ID=user;Password=mypassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

【问题讨论】:

  • 您将应用发布到哪个 Azure 服务?您是在 Azure VM 中运行 SQL Server 还是使用 Azure SQL 数据库?您的 SQL Server(两种情况)是使用公共 IP 端点还是私有 IP 端点部署的?
  • @DavidBrowne-Microsoft 我通过在 VS > Publish> Web Deploy 中单击我的解决方案来发布它。我使用的数据库托管在 Azure 上。我也尝试在 Azure VM 中使用数据库,但这给出了同样的错误。我不太明白你最后一个问题的意思?我可以连接到 SSMS 中的两个数据库。
  • 我已经更新了我的答案,还提供了另一个关于如何在门户中配置Connection strings 的文档。希望对你有用。
  • 当你使用 `VS > Publish> Web Deploy.`... 你把它部署到哪里了?您是否将其部署到 Azure 应用服务? “允许 Azure”应该允许它连接。你说 我的后端 IP 到防火墙异常。你是如何确定这个IP的?目前还不清楚你的后端在哪里。对于 Azure 中的许多服务,IP 地址会发生变化。
  • 那么您最初使用的只能在本地运行的连接字符串是什么?

标签: sql-server azure .net-core


【解决方案1】:

更新

我按照教程操作,详细步骤见截图。 The official documentation 包含示例代码,您可以下载查看。我将我的 conn 字符串放入我的代码中。

如果你在 web.config 或其他文件中配置你的连接字符串,你可以看到this document。你可以在你的门户中配置它。

Step 1. 修改代码中的连接字符串,并添加一个接口进行测试。

第 2 步。为 peoject 创建一个待办事项表。 [确保你已经完成Firewall setting]

第 3 步。在本地测试然后部署。可以看到我的项目运行成功,界面可以使用了。

私人

你可以去你的 sqldb 找到Connection strings 并复制那里提供的那个。

此字符串的格式为:

Data Source=tcp:servername.database.windows.net,1433;Initial Catalog=db;
Persist Security Info=False;
User ID=user;Password=mypassword;
MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;
Connection Timeout=30;

还有a post 也有同样的问题。更多详情,你可以阅读。

【讨论】:

  • 非常感谢您的回答和付出的努力。我通过从“连接字符串”复制字符串并将其设置为我的门户中的连接字符串解决了我的问题,然后在我的 c# 代码中使用它,如下所示:services.AddDbContext<TodoContext>(options =>options.UseSqlServer(Environment.GetEnvironmentVariable("SQLAZURECONNSTR_nameOfMyConnString")));
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多