Azure Web App无法访问Azure数据库。

7
我拥有一个Azure试用账户,其中包含一个SQL数据库和一个ASP.NET 5 Web应用程序。数据库服务器防火墙已经设置了我的本地计算机IP的规则,并勾选了“允许访问Azure服务”的复选框。我可以从本地的Sql Server Manager连接到Azure数据库而没有任何问题。
Web应用程序在其“应用程序设置/连接字符串”部分设置了此连接字符串。我已经检查过该Web应用程序正在使用此连接字符串:
"Server=tcp:[MyServerName].database.windows.net,1433;Database=[MyDbName];User ID=[MyUserName]@[MyServerName];Password=[MyPassword];Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
这个相同的连接字符串在桌面客户端中也被使用并且正常工作。然而,Web应用程序无法连接到服务器,并抛出了这个异常,它很清楚,但我不知道如何解决。
"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"

我知道这里已经有很多类似的问题被问答过了,但是它们都不是我正在面临的确切问题,也没有解决方案适用于我。

感谢大家花时间。

更新1

作为测试,我已经将网站配置在我的本地IIS上,与Azure DB配合运行,它也可以正常工作。因此,桌面应用程序、SQL Server Manager和IIS都可以从我的本地计算机访问此数据库。当然,在服务器防火墙中我的IP地址已经被加入白名单,但Azure应用服务也已经被加入白名单,但没有访问权限。

enter image description here

更新2

Joe Raio的评论促使我仔细检查了地区配置,并附上了当前设置的截图。我相信一切都是正确的。

enter image description here


你是否尝试将你的网页服务器地址添加到数据库的防火墙设置中?等我有时间的时候,我会尝试复现你的情况,看看能否进一步排除故障。 - Shahed C - MSFT
1
网站托管在Azure App Services中,因此我不知道如何找到IP地址。但是,在SQL服务器的防火墙设置中,有一个启用“允许访问Azure服务”的规则,应该可以将Azure内部的所有应用程序列入白名单。 - Dídac Punyet
您可以点击 Web 应用程序的“属性”选项卡查看 IP 地址。虽然根据您的描述,您不必添加 Web 应用程序的 IP 地址。它应该可以工作。Web 应用程序和 SQL 数据库是否都托管在同一个 Azure Geo 区域中? - Joe Raio
你能从属性选项卡中获取IP地址并尝试以这种方式添加吗? - Joe Raio
您可以参考 https://support.microsoft.com/zh-cn/help/10085/troubleshooting-connectivity-issues-with-microsoft-azure-sql-database 来解决此问题。我猜测是您的 Azure Web 应用程序阻止了对 1433 端口的访问。 - qingsong
显示剩余2条评论
1个回答

1

这个Web应用程序在其“应用设置/连接字符串”部分设置了此连接字符串。我已经检查过Web应用程序正在使用此连接字符串:

这不是您为ASP.net 5应用程序设置连接字符串的位置。

打开文件appsettings.json,第一部分应包含以下数据

  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-WestEuroSODBAccess-96be0407-8bee-4c89-97e5-f6711136f106;Trusted_Connection=True;MultipleActiveResultSets=true"
    }

将您的连接字符串放在那里。类似于这个

  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=tcp:[MyServerName].database.windows.net,1433;Database=[MyDbName];User ID=[MyUserName]@[MyServerName];Password=[MyPassword];Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
    }

这将解决问题。我最初没有注意到您正在设置 ASP.net 5 应用程序。

更多信息可以在这里找到:http://docs.asp.net/en/latest/fundamentals/configuration.html


感谢你的努力,但我已经做过了。在本地运行时它完美无缺。但是当我发布网站时,它就不起作用了。由于安全性现在不是我的问题,我甚至在网站上打印了连接字符串,它是正确的(在本地IIS、SSMS、桌面应用程序中都可以工作),但是我在发布时遇到了错误40。这可能与实体框架有关吗? - Dídac Punyet
有一件事让我想到的是错误提示中提到了一个“命名管道”问题,但连接字符串上却有“tcp”。我知道这是两种不同的协议,所以也许这是个有用的线索。 - Dídac Punyet
2
问题在于你声明dbContext的位置。我建议从一个内置的ASP.net 5模板开始,并将连接字符串放在appsettings.json中。然后,您将看到问题出现在您的代码中,而不是Azure中。希望一切顺利! - Joe Raio
1
就是这样,由工具“dnx ef dbcontext scaffold”自动创建的DbContext使用了本地连接字符串,即使我在应用程序级别上有正确的连接字符串。谢谢Joe! - Dídac Punyet
发布配置文件也可以设置覆盖这些字符串。这是未来需要检查的事情。 - rollsch
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接