在 Azure 中为 ASP.NET Core Web 应用设置 SQL 连接字符串

Posted

技术标签:

【中文标题】在 Azure 中为 ASP.NET Core Web 应用设置 SQL 连接字符串【英文标题】:Setting the SQL connection string for ASP.NET Core web app in Azure 【发布时间】:2015-09-14 20:51:06 【问题描述】:

我在 Visual Studio 2015 中创建了一个新的 ASP.NET Core Web 应用程序。我还设置了一个 Azure Web 应用程序以从 GitHub 中拉入该应用程序并运行它。这工作正常,但我无法连接到 Azure 上的数据库。

在本地,这是可行的,它使用config.json 和代码Data:DefaultConnection:ConnectionString 作为连接字符串。

我怎样才能让代码保持原样,并让它在 Azure 中也能工作?我尝试在门户中设置应用程序设置,包括连接字符串和应用程序设置。并使用“SQLCONNSTR_DefaultConnection”和“Data:DefaultConnection:ConnectionString”作为键。

(顺便设置一下App Settings好像不行,我觉得我提供的值太长了)。

那么,如何在不将其签入源代码控制的情况下,将 Azure 数据库的连接字符串提供给我的 Azure Web 应用程序 (ASP.NET 5)?

更新 我的 Startup.cs 看起来像这样(参见 the full file on GitHub):

public Startup(IHostingEnvironment env)

    var configuration = new Configuration()
        .AddJsonFile("config.json")
        .AddJsonFile($"config.env.EnvironmentName.json", optional: true);

    if (env.IsEnvironment("Development"))
    
        configuration.AddUserSecrets();
     

    configuration.AddEnvironmentVariables();
    Configuration = configuration;

ConfigureServices方法中,还有:

services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));

并且,同样在ConfigureServices 方法中:

services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options => 
                   options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]))
            .AddDbContext<InvoicesDbContext>(options => 
                   options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
// So this is where I want my app in Azure to use the connection string I
// provide in the portal

【问题讨论】:

您能分享一下您的 Startup.cs 配置条目的外观吗? 如果您已正确设置所有内容,那么在您的 azure 网站中指定 Data:DefaultConnection:ConnectionString 应该就可以了 您的示例代码未显示您如何访问 ConnectionString。您在哪里访问 ConnectionString?语法是什么。你也可以通过在VS中的项目属性->调试下设置环境变量来在本地测试环境变量。这有助于故障排除(即您设置 environment_variable 名称和设置名称相同)。 @GeraldDavis 我添加了关于如何访问连接字符串的代码。我将尝试有关项目属性的提示。 【参考方案1】:

简答

我尝试在门户中设置应用程序设置,包括连接字符串和应用程序设置。并使用“SQLCONNSTR_DefaultConnection”和“Data:DefaultConnection:ConnectionString”作为键。

你已经接近了。

    转到 Azure Web 应用 > 配置 > 连接字符串。 添加名称为DefaultConnection 的连接字符串。 使用Configuration.Get("Data:DefaultConnection:ConnectionString") 访问它。

使用timesheet_db 代替DefaultConnection 的示例

这是我自己的时间表应用程序中的一个示例。我的连接字符串被命名为timesheet_db。只需将该字符串的所有实例替换为 DefaultConnection 即可使示例适应您的用例。

Azure Web 应用配置

Azure Web 应用服务控制管理器

https://myWebAppName.scm.azurewebsites.net/Env 的在线服务控制管理器将显示连接字符串。

Startup.cs

Startup 中设置配置设置,以便环境变量覆盖 config.json。

public IConfiguration Configuration  get; set; 
public Startup()

    Configuration = new Configuration()
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();    <----- will cascade over config.json

Startup中配置数据库。

public void ConfigureServices(IServiceCollection services)

    services
        .AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<ProjectContext>(options =>
        
            var connString =
                Configuration.Get("Data:timesheet_db:ConnectionString");
            options.UseSqlServer(connString);
        );

当然,该示例使用名为timesheet_db 的连接字符串。对你来说,用你自己的名为DefaultConnection 的连接字符串替换它的所有实例,一切都会正常工作。

【讨论】:

这行得通。但是将“DefaultConnection”转换为“Data:DefaultConnection:ConnectionString”的魔法是什么? 魔法存在于 EnvironmentVariableConfigurationProvider 中,例如检查github.com/aspnet/Configuration/blob/dev/src/…。 顺便说一句,RC2 中的约定正在改变。配置密钥的格式为ConnectionStrings:name Configuration.Get 具有该配置名称约定在最终版本中不再起作用。我们需要改用Configuration.GetConnectionString("timesheet_db")。 ***.com/a/37511645/397807【参考方案2】:

在 RC2 中,我必须更改读取连接字符串的方式才能让它们在 Azure 中工作。在我的情况下,我必须确保 Azure 连接字符串被命名为“DefaultConnection”,并通过以下方式访问:

RC1:


    "Data": 
        "DefaultConnection": 
            "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=db;Trusted_Connection=True;"
        
    

访问者:

var conn = Configuration["Data:DefaultConnection:ConnectionString"];

RC2:


  "Data": 

  ,
  "ConnectionStrings": 
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=db;Trusted_Connection=True;"
  

访问者:

var conn = Configuration.GetConnectionString("DefaultConnection");

【讨论】:

【参考方案3】:

您有许多选项来设置连接字符串。 默认设置类从不同来源获取环境设置。 您可以在 config.production.json 中设置连接字符串。或 config.staging.json。查看启动类

    public Startup(IHostingEnvironment env)
    
        // Setup configuration sources.
        var configuration = new Configuration()
            .AddJsonFile("config.json")
            .AddJsonFile($"config.env.EnvironmentName.json", optional: true);

        if (env.IsEnvironment("Development"))
        
            // This reads the configuration keys from the secret store.
            // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
            configuration.AddUserSecrets();
        
        configuration.AddEnvironmentVariables();
        Configuration = configuration;
    

【讨论】:

我知道,但我不想将 config.production.json 添加到我公开的 GitHub 存储库中。据我了解,您可以在 Azure 门户中指定设置和连接字符串(阅读 this)。但我无法让它工作。【参考方案4】:

我想你在找SlotSticky Settings

在 Azure PowerShell 中使用此命令将 2 个应用设置设置为粘到插槽

Set-AzureWebsite -Name mysite -SlotStickyAppSettingNames @("myslot", "myslot2")

这个命令将 2 个连接字符串设置为粘在插槽上

Set-AzureWebsite -Name mysite -SlotStickyConnectionStringNames @("myconn", "myconn2")

【讨论】:

以上是关于在 Azure 中为 ASP.NET Core Web 应用设置 SQL 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

在应用服务环境中安装 ASP.NET CORE 3.0 扩展?

Azure 部署后 ASP.NET Core MVC webapp 错误

如何在 Asp.Net Core 中为日期绑定设置文化?

在 Azure 上部署 Asp.NET Core Web App

ASP.NET Core Web API HTTP POST 在 Azure 中返回 404

在 Azure WebApps 中运行64位 Asp.net Core 应用