ASP.NET Core 2.x OnConfiguring получает строку подключения из appsettings.json - PullRequest
0 голосов
/ 30 октября 2018

Только что начал возиться с 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 голосов
/ 30 октября 2018

Когда вы используете Scaffold-DbContext, по умолчанию он жестко кодирует вашу строку в класс DbContext (так что он работает "из коробки"). Чтобы продолжить, вам нужно зарегистрировать DbContext в классе запуска. Чтобы настроить это, вы можете проверить инструкции в этот ответ .

Обратите внимание, что свойство Configuration напрямую подключается к вашему appsettings.json и нескольким другим местоположениям. Вы можете прочитать больше об этом в этой документации . Несмотря на то, что вы всегда можете использовать файл appsettings.json, обычно рекомендуется хранить свои секреты безопасности во внешнем файле json вне исходного кода. Лучшее решение для этого во время разработки - использование секретного менеджера . Самый простой способ использовать это - щелкнуть правой кнопкой мыши на вашем проекте в Visual Studio и выбрать «Управление секретами пользователя». Откроется файл json, который уже подключен к вашему Configuration объекту.

Как только это настроено, вам нужно использовать внедрение зависимостей для доступа к вашему контексту БД.

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
     }
}

Когда вы используете, он каждый раз создает новое соединение. Использование внедрения гарантирует, что только одно соединение создается для запроса независимо от того, сколько раз оно используется.

0 голосов
/ 30 октября 2018

В классе запуска проекта .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

0 голосов
/ 30 октября 2018

В том месте, где вы хотите получить доступ к appsettings.json,

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

Теперь, когда у вас есть объект, вы можете получить доступ к его содержимому. Дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...