Как прочитать строку подключения в ASP. NET Core Razor Pages - PullRequest
1 голос
/ 25 марта 2020

Я не могу понять, как извлечь строки подключения в ASP. NET Core. Я провел два дня, пробуя разные вещи, и не могу заставить его работать.

Я пробовал следующие методы:

  • Использование ConfigurationManager.AppSettings a Count возвращает 0
  • Используя ConfigurationManager.ConnectionStrings []. ConnectionString - единственная существующая строка соединения -. \ SQLEXPRESS (необходимо использовать индекс вместо строка в ConnectionStrings []), указание имени соединения приводит к тому, что ссылка на объект не установлена. Ошибка
  • При попытке использовать WebConfigurationManager не удается найти способ его добавления. Я пробовал System.Web.Configuration, пакеты NuGet, ссылки.
  • Использование IConfiguration и внедрение зависимостей - я понятия не имею, как читать строку подключения (как ссылаться на контроллера в модели и считайте значение строки подключения "xxx")
ConfigurationManager.ConnectionStrings["SupplierDB"].ConnectionString
// NullReferenceException: Object reference not set to an instance of an object.

ConfigurationManager.ConnectionStrings[0].ConnectionString
// data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true

ConfigurationManager.AppSettings.Count.ToString();
// Returns 0

У меня есть одинаковые строки подключения, указанные в обоих appsettings. json и web.config. Может кто-нибудь, пожалуйста, направьте меня в правильном направлении, поскольку я в настоящее время полностью потерян, поскольку ничего не работает.

appsettings. json

{
  "ConnectionStrings": {
    "CustomerDB": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Customer_Db;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
    "SupplierDB": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Supplier_Db;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

web .config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="CustomerDB" providerName="System.Data.SqlClient" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Customer_Db;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"/>
    <add name="SupplierDB" providerName="System.Data.SqlClient" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Supplier_Db;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"/>
  </connectionStrings>
</configuration>

Ответы [ 3 ]

3 голосов
/ 25 марта 2020

Вы можете создать такой класс AppSettings, скопировав свои настройки приложения. json в QuickType :

public class AppSettings
{
    public static ConnectionStrings ConnectionStrings { get; set; }
    public static Logging Logging { get; set; }
    public static string AllowedHosts { get; set; }
}

public class ConnectionStrings
{
    public string CustomerDb { get; set; }
    public string SupplierDb { get; set; }
}

public class Logging
{
    public LogLevel LogLevel { get; set; }
}

public class LogLevel
{
    public string Default { get; set; }
    public string Microsoft { get; set; }
    public string MicrosoftHostingLifetime { get; set; }
}

Затем в Startup:

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)
    {
        Configuration.Get<AppSettings>();
        services.AddControllersWithViews();
    }

Я использую static для легкого доступа вместо введения AppSettings через DI.

Или, если вы не хотите помещать их все в класс, проверьте Параметры шаблон от Microsoft.

0 голосов
/ 26 марта 2020

Вы можете получить значение строки подключения в appsettings. json как показано ниже:

Для Mvc:

public class HomeController : Controller
{
    public readonly IConfiguration _configuration;
    public HomeController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public IActionResult Index()
    {
        string CustomerDBConnectionString = _configuration.GetConnectionString("CustomerDB");
        string SupplierDBConnectionString = _configuration.GetConnectionString("SupplierDB");

        return View();
    }
} 

Для страниц бритвы:

public class IndexModel : PageModel
{
    public readonly IConfiguration _configuration;
    public IndexModel(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public void OnGet()
    {
        string CustomerDBConnectionString = _configuration.GetConnectionString("CustomerDB");
        string SupplierDBConnectionString = _configuration.GetConnectionString("SupplierDB");
    }
}

Результат: enter image description here

0 голосов
/ 25 марта 2020

Убедитесь, что у вас установлены следующие NuGets:

Microsoft.Extensions.Configuration;
Microsoft.Extensions.Configuration.Json;
//Microsoft.Extensions.Configuration.UserSecrets; //Microsoft.Extensions.Configuration.EnvironmentVariables;
  • Создайте следующий класс:

с помощью Microsoft.Extensions.Configuration; using System.IO;

    public static class CustomConfiguration
        {
            public static IConfigurationRoot config;

            public static void BuildConfiguration()
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                    //.AddUserSecrets(Assembly.GetExecutingAssembly(), optional: true, reloadOnChange: true)
                    //.AddEnvironmentVariables();

                config = builder.Build();
            }
}

Затем вызовите метод Subject из любого места, где вам нравится

    CustomConfiguration.BuildConfiguration();
    string connectionString = CustomConfiguration.config.GetConnectionString("CustomerDB");
...