如何在ASP .NET Core Razor Pages中读取连接字符串

3

我无法理解如何在ASP .NET Core中检索连接字符串。我尝试了两天所有不同的方法,但都无法使其正常工作。

我尝试了以下几种方法:

  • 使用ConfigurationManager.AppSettings,计数返回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个回答

4
您可以创建一个名为AppSettings的类,通过将您的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来方便访问。

或者,如果您不想将它们全部放在一个类中,请查看 Microsoft 的 Options模式


2
你可以从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();
    }
} 

对于 Razor Pages:

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");
    }
}

结果: 在此输入图片描述

我相信有一种更新的方法可以在没有cshtml或code-behind的情况下完成这个任务。 - MC9000
Startup.cs长什么样? - cdub

-1
请确保您已安装以下 NuGet 包:
Microsoft.Extensions.Configuration;
Microsoft.Extensions.Configuration.Json;
//Microsoft.Extensions.Configuration.UserSecrets; //Microsoft.Extensions.Configuration.EnvironmentVariables;

生成以下类:
``` using 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");

1
你把这个类放在哪里了? - MC9000
此答案与DotNet5和DotNet6的Blazor不兼容。 - MC9000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接