检索并使用Windows Azure的连接字符串?

10

我已在Azure管理门户Configure->Connection Strings(链接资源)中配置了连接字符串:

在此输入图片描述

这些连接字符串有什么用处?

我尝试从web.config文件中删除连接字符串,以便从这里读取,但没有成功。

还有其他方法吗?

基本上我想使用这些连接字符串覆盖web.config中的连接字符串,以在生产环境中使用。

我已将以下内容添加到Application_Start方法中:

var sb = new StringBuilder();
var appConfig = ConfigurationManager.OpenMachineConfiguration();  
foreach (ConnectionStringSettings conStr in appConfig.ConnectionStrings.ConnectionStrings)
  sb.AppendFormat("Name: {0}, ConnectionString: {1}\n", conStr.Name, conStr.ConnectionString);
throw new Exception(sb.ToString());

这是结果:

名称:LocalSqlServer,连接字符串:数据源=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true

我也尝试使用ConfigurationManager.ConnectionStrings,但服务器(Azure)的连接字符串没有出现。

2个回答

12

门户中的连接字符串允许您覆盖在 web.config 中定义的连接字符串。

当您在本地开发时,您可能使用位于 localhost\SQLExpress 或类似位置的数据库。如果部署时未设置 web.config 转换,这意味着在 Windows Azure 中运行的 Web Site 仍然指向 localhost\SQLExpress,这不是您想要的。

门户中的连接字符串允许您覆盖已经在 web.config 中定义的现有连接字符串。如果您的 web.config 不包含与在门户中配置的名称相同的连接字符串,则该连接字符串将不会被添加并在运行时无法访问。这可能是您遇到的问题。

要解决此问题,只需在 web.config 文件中添加一个与已经添加到门户的连接字符串名称相同的连接字符串即可。

更新:如我之前在评论中所解释的,Windows Azure Web Sites 并没有物理修改 web.config (source),它是在运行时执行此操作。因此,为了检查哪些 AppSettings 和 ConnectionStrings 实际上可以在运行时使用,请尝试以下操作:

Controller:

public ActionResult Index()
{
  ViewBag.ConnectionStrings =
    ConfigurationManager.ConnectionStrings.Cast<ConnectionStringSettings>();
  ViewBag.AppSettings = ConfigurationManager.AppSettings;
  return View();
}

查看:

<h3>ConnectionStrings:</h3>
<ul>
  @foreach (var setting in ViewBag.ConnectionStrings)
  {
    <li>@setting.Name: @setting.ConnectionString</li>
  }
</ul>
<h3>AppSettings:</h3>
<ul>
  @foreach (var s in ViewBag.AppSettings)
  {
    <li>@setting: @System.Configuration.ConfigurationManager.AppSettings[s]</li>
  }
</ul>

不,所有被覆盖的连接都在web.config中,但它们实际上并没有被覆盖,请查看这个让我苦不堪言的错误 - Shimmy Weitzhandler
在运行时覆盖web.config,Windows Azure Web Sites不会物理修改web.config。我会更新我的答案。 - Sandrino Di Mattia
在“Application_Startup”中不起作用。虽然我没有在视图/控制器中尝试过。请查看我的更新问题。 - Shimmy Weitzhandler
这让我感到很困惑。我正在使用FTP检查已部署的web.config文件,并找到开发连接字符串,不知道为什么网站正在使用生产连接字符串!感谢您的解释! - Darryl
非常有帮助!不过,视图中包含一个小的Ctrl-C Ctrl-V错误,在appsettings部分@settings不存在,因此应该像这样:<li>@s:@System.Configuration.ConfigurationManager.AppSettings[s]</li> - Henrik Fransas

3

经过两天的努力,我终于成功了。我在这里分享我的解决方案,希望对未来的某个人有所帮助。

环境

  • Azure API APP(但理论上,它也适用于其他类型的项目)
  • SQL DB(托管在Azure上)。它可以是任何数据库
  • EF 6.0 - 数据库优先方法
  • 连接字符串存储在Azure下的应用程序设置 ->连接字符串部分。如下图所示:

从Azure -> Api App -> Application Settings-> Connection Strings中获取快照

我想做什么 我想将我的连接字符串放在Azure上,并像@Sandrino Di Mattia提到的那样,从那里动态检索它。

对我有用的步骤

  1. 在web.config文件中创建一个connectionStrings

`

<connectionStrings>
    <add name="dbConnectionStringForAzure" connectionString="Local Connection String" providerName="System.Data.EntityClient"/>
  </connectionStrings>

请注意,providerName 是 System.Data.EntityClient 而不是 System.Data.SqlClient。
附加信息:发布项目后,您可以验证 web.config 中的连接字符串。导航到 projectorapiurl.scm.azurewebsites.net。
转到菜单 -> 调试控制台 -> PowerShell -> 编辑 Web.config 文件。(还有其他获取 web.config 文件的方法。使用您喜欢的一种。)
请注意:在这里,您可能会发现 Azure 生成了另一个连接字符串。我们不使用它,安全删除即可。
2. 转到 Azure -> 您的项目和应用程序设置。添加以下详细信息:
名称 = dbConnectionStringForAzure 值 = Provider=System.Data.SqlClient; metadata=res://*/csdlModel.csdl|res://*/ssdlModel.ssdl|res://*/mslModel.msl; Provider Connection String ='Data Source=server.database.windows.net,1433;initial catalog=database;User ID=username;Password=password;MultipleActiveResultSets=True;App=EntityFramework;'
从第三个下拉列表中选择自定义。这很重要,否则 Azure 将在连接字符串的提供程序名称中添加 System.Data.SqlClient(或任何其他提供程序,具体取决于所选内容),而我们不需要。
保存
在此阶段,Azure 应在运行时使用此连接字符串。想要验证吗?像 @Sandrino Di Mattia 建议的那样执行类似操作,或者参考 @Shaun Luttin 在此 SO 帖子中的做法 (使用 C#.NET 检索链接到 Windows Azure Web Site 的 SQL Azure 数据库的连接字符串)
或者,在任何 Razor 模板中放置以下代码:
    <p>Value of dbConnectionStringForAzure  :
    @System.Configuration.ConfigurationManager.ConnectionStrings["dbConnectionStringForAzure"].ConnectionString    
    </p>

另一方面,我已经在我的DbContext构造函数中设置了连接字符串名称。
        public MyEntities() : base("name=dbConnectionStringForAzure")
        {

        }

现在,当我调用我的API时,它会动态地使用存储在Azure中的连接。
感谢数十篇帖子和额外的咖啡提神!

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