首页 文章

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

提问于
浏览
7

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

enter image description here

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

我试着删除conn . 来自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,ConnectionString:data source = . \ SQLEXPRESS; Integrated Security = SSPI; AttachDBFilename = | DataDirectory | aspnetdb.mdf; User Instance = true

我也尝试了上面的 ConfigurationManager.ConnectionStrings 和服务器(Azure)连接字符串不存在 .

2 回答

  • 2

    Portal中的连接字符串允许您覆盖 web.config 中定义的连接字符串 .

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

    Portal中的 connection strings 允许您覆盖已在web.config中定义的 existing connection strings . 如果您的web.config不包含与门户网站中配置的连接字符串同名的连接字符串,则不会添加该字符串并且可以在运行时访问它 . 这可能是您遇到的问题 .

    To fix this, 只需在web.config文件中添加一个连接字符串,其名称与您已添加到门户网站的名称相同 .

    Update: 就像我在评论中已经解释的那样,Windows Azure网站没有物理修改web.config(source),它在运行时执行此操作 . 因此,为了检查运行时实际可用的AppSettings和ConnectionStrings,请尝试以下操作:

    控制器:

    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>
    
  • 12

    两天后,我终于设法让它上班了 . 我在这里添加我的解决方案,希望它可能在将来帮助某人 .

    Environment

    • Azure API APP(但理论上,它也适用于其他类型的项目)

    • SQL DB(托管在Azure上) . 它显然可以是任何db

    • EF 6.0 - 数据库第一种方法

    • 连接字符串存储在Azure上的“应用程序设置” - >“连接字符串”部分下 . 图片如下所示

    Snapshot from Azure -> Api App -> Application Settings-> Connection Strings

    What I wanted to do 我想把我的连接字符串放在Azure上,就像提到的@Sandrino Di Mattia一样,从那里动态检索它 .

    Steps which worked for me

    • 在web.config中创建connectionStrings

    `

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

    `

    请注意,providerName是System.Data.EntityClient而不是System.Data.SqlClient .

    Extra bit: 此外,一旦发布了项目,就可以验证web.config中的连接字符串 . 导航到projectorapiurl.scm.azurewebsites.net .

    转到菜单 - >调试控制台 - > PowerShell - >编辑Web.config文件 . (还有其他方法可以获取web.config文件 . 使用您喜欢的文件 . )

    Note: 您可以在此处找到Azure自动生成的另一个连接字符串 . 它's safe to remove that as we aren'吨使用它 .

    • 转到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;'

    • 前面第三个下拉列表,选择CUSTOM . 重要的是,Azure将在我们的连接字符串的提供程序名称中添加System.Data.SqlClient(或任何其他提供程序,具体取决于所选内容),这是我们不需要的 .

    • 保存

    在此阶段,Azure应在运行时使用此连接字符串 . 想验证!?类似于@Sandrino Di Mattia的上述建议,或@Shaun Luttin Retrieve the connection string of an SQL Azure database that is linked to a Windows Azure Web Site with C#.NET的SO帖子 .

    或者,将以下代码放在任何剃刀模板中:

    <p>Value of dbConnectionStringForAzure  :
        @System.Configuration.ConfigurationManager.ConnectionStrings["dbConnectionStringForAzure"].ConnectionString    
        </p>
    

    另一方面,我在我的DbContext构造函数中设置了连接字符串名称 .

    public MyEntities() : base("name=dbConnectionStringForAzure")
            {
    
            }
    

    现在,当我调用我的API时,它动态地使用存储在Azure中的连接 .

    感谢几十个帖子和额外的咖啡!

相关问题