首页 文章

辅助角色不会连接到SQL Azure

提问于
浏览
2

我正在研究一个使用 Cloud 服务的典型Web应用程序来学习如何使用windows azure . 在我的部署中,我有两个角色,一个运行ASP.NET MVC应用程序的Web角色,以及一个提供一些后端服务的辅助角色 .

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

奇怪的是,在Web角色上,实体框架成功地连接和执行针对SQL Azure数据库的查询 . 但是当在Worker Role中运行相同的代码时,它会崩溃并出现以下异常:

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

我验证了使用的连接字符串是相同的,但是在确定Worker Role无法连接的原因方面却没有成功 .

EDIT: 使用Compute Emulator和SQL Azure连接字符串(已配置正确的防火墙例外)执行角色,代码未崩溃 . 显然,只有当代码在 Cloud 中运行时才会发生 .

EDIT 2: SQL Azure防火墙已正确配置为允许来自Azure数据中心的连接,Web角色的成功连接就是证明 .

3 回答

  • 1

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

    我的worker角色使用Azure的配置,使用 RoleEnvironment.GetConfigurationSettingValue() 获取连接字符串并将连接字符串本身传递到上下文的构造函数中 . 这在仿真器中针对 生产环境 数据库工作,但不在Azure Cloud 本身中工作 .

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

    当然,App.config文件不能开箱即用,不像Web.config文件(因为,嘿,谁需要它?)所以我不得不按照指令here来实现 .

  • 0

    检查您的不同 Cloud 配置 . (在默认项目模板中,您可能有一个用于Local和One for Cloud)

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

    验证您是否在发布模式下覆盖连接字符串 .

  • 3

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

相关问题