ASP.NET Core 2.x OnConfiguring从appsettings.json获取连接字符串字符串

时间:2018-10-30 19:50:37

标签: asp.net-core visual-studio-2017

从现在开始就开始使用ASP.NET Core,这令人印象深刻。在生成的代码中,(见下文)。我想更改硬编码的连接字符串,以从appsettings.json文件中获取它。

这显然是不可能的。我还没有找到一个可行(甚至可以构建)的示例。

这是怎么回事? 请帮助

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
            optionsBuilder.UseSqlServer("Server=xxxxxxx;Database=xxxxx;Trusted_Connection=True;");
        }
    }

提供的链接在一个区域内解决了问题,但在OnConfiguring的此处无效。我在做什么错了?

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        var connection = Configuration.GetConnectionString("ConnectionName");
        services.AddDbContext<SurveyContext>(options => options.UseSqlServer(connection));
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

3 个答案:

答案 0 :(得分:1)

在您要访问appsettings.json的地方,

JToken jAppSettings = JToken.Parse( 
      File.ReadAllText(Path.Combine(Environment.CurrentDirectory, 
      "appsettings.json")));

现在,由于有了对象,因此可以访问其内容。 让我知道它是否有效。

答案 1 :(得分:1)

在使用Scaffold-DbContext时,默认情况下,它将您的字符串硬编码到DbContext类中(因此它是开箱即用的)。您需要在启动课程中注册DbContext才能继续。要进行设置,您可以查看this answer中的说明。

请注意,Configuration属性直接连接到您的appsettings.json和其他几个位置。您可以在this documentation中了解更多信息。虽然您始终可以使用appsettings.json文件,但通常建议将您的安全机密保存在源代码之外的外部json文件中。在开发过程中,最好的解决方案是使用secret manager。最简单的方法是在Visual Studio上右键单击您的项目,然后选择“管理用户机密”。这将打开一个已经连接到您的Configuration对象的json文件。

设置完成后,您需要使用依赖注入来访问数据库上下文。

public class HomeController : Controller
{


     public HomeController(SurveyContext context)
     {
         // you can set the context you get here as a property or field
         // you can use visual studio's shortcut ctrl + . when the cursor is on "context"

         // you can then use the context variable inside your actions
     }
}

使用using时,它每次都会创建一个新的连接。使用注入可确保每个请求无论创建多少次都仅创建一个连接。

答案 2 :(得分:1)

通常在.NET Core项目的启动类中,将其注册到ConfigureServices函数中。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<YourContext>(options => options.UseSqlServer(connection));
}

当您处于.NET Core的启动类中时,从appsettings.json中读取值是没有问题的。

您可以在Microsoft上找到更多信息,例如:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db