2

我正在开发一个使用云服务的典型 Web 应用程序来学习如何使用 Windows azure。在我的部署中,我有两个角色,一个是运行 ASP.NET MVC 应用程序的 Web 角色,另一个是提供一些后端服务的辅助角色。

该数据库托管在 SQL Azure 上(在同一订阅和数据中心中),并使用 Entity Framework Code First 进行管理。连接字符串是 Azure 提供的。

奇怪的是,在 Web Role 上,Entity Framework 成功地连接和执行了对 SQL Azure 数据库的查询。但是当在 Worker Role 中运行相同的代码时,它会崩溃并出现以下异常:

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

我验证了使用的连接字符串是相同的,但未能成功确定 Worker Role 无法连接的原因。

编辑:使用 Compute Emulator 和 SQL Azure 连接字符串(已配置正确的防火墙异常)执行角色并且代码没有崩溃。因此,显然只有当代码在云中运行时才会发生。

编辑 2: SQL Azure 防火墙已正确配置为允许来自 Azure 数据中心的连接,Web 角色的成功连接证明了这一点。

4

3 回答 3

3

我有这个问题。我的 Web 角色是从 Web.config 文件中获取数据库连接字符串(因为 XSLT 转换运行良好)。实际上,我将连接字符串的名称传递给了上下文的构造函数,而不是连接字符串本身。

我的工作角色使用 Azure 的配置,RoleEnvironment.GetConfigurationSettingValue()用于获取连接字符串并将连接字符串本身传递到上下文的构造函数中。这在模拟器中针对生产数据库有效,但不适用于 Azure 云本身。

我的解决方案是停止使用 Azure 配置,而是将连接字符串放入我的 App.config,并将连接字符串的名称传递给上下文的构造函数,就像我在 Web 角色中所做的那样。这解决了我的问题,并且工作角色能够毫无问题地连接到数据库。

当然,App.config 文件不能进行开箱即用的转换,这与 Web.config 文件不同(因为,嘿,谁需要那个?)所以我必须按照这里的说明来实现这一点。

于 2014-04-16T04:59:16.330 回答
1

检查您的不同云配置。(在默认项目模板中,您可能有一个用于本地和一个用于云)

如果您使用 Config Transforms,还要检查您的不同版本配置。即在 App.Config / Web.Config 下,您可能会看到 App.Debug.Config / App.Release.Config。

验证您没有在发布模式下覆盖连接字符串。

于 2013-09-12T08:52:12.990 回答
0

确保在 Azure 门户中数据库的“配置”下,在“允许的服务”部分中,Windows Azure 服务设置为 = YES。这是适用于 Windows Azure 服务的特殊防火墙规则 (0.0.0.0)。启用此选项可让 Windows Azure 服务连接到您的 SQL 数据库。

于 2013-09-11T23:09:34.820 回答