Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core IConfiguration对象为空。_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

Asp.net core IConfiguration对象为空。

Asp.net core IConfiguration对象为空。,asp.net-core,asp.net-core-2.0,Asp.net Core,Asp.net Core 2.0,我正在尝试从appsettings.json读取连接字符串,我正在使用: services.AddSingleton(Configuration); 启动时的这一行抛出null。我是core2.0的新手。有人能告诉我我错过了什么吗 我的创业: public class Startup { public static string ConnectionString { get; private set; } public IConfiguration Configuration

我正在尝试从
appsettings.json
读取连接字符串,我正在使用:

services.AddSingleton(Configuration);
启动时的这一行抛出null。我是core2.0的新手。有人能告诉我我错过了什么吗

我的创业:

public class Startup
{
    public static string ConnectionString { get; private set; }
    public IConfiguration Configuration { get; }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSingleton(Configuration);
        services.AddSingleton<IConfiguration>(Configuration);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }
}
公共类启动
{
公共静态字符串连接字符串{get;private set;}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.AddSingleton(配置);
services.AddSingleton(配置);
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
我的控制器:

public class CreateController : Controller
{
    public IConfiguration _ConnectionString;
    public CreateController(IConfiguration configuration)
    {
        _ConnectionString = configuration;
    }

    public IEnumerable<string> Get()
    {
        Markets();
    }

    public string Markets()
    {
        using(SqlConnection con = new SqlConnection(_ConnectionString.GetSection("Data").GetSection("ConnectionString").Value))
        {
            return con.Database;
        }
    }
}
公共类CreateController:控制器
{
公共IConfigurationString;
公共CreateController(IConfiguration配置)
{
_ConnectionString=配置;
}
公共IEnumerable Get()
{
市场();
}
公开市场()
{
使用(SqlConnection con=newsqlconnection(_ConnectionString.GetSection(“数据”).GetSection(“ConnectionString”).Value))
{
返回con.数据库;
}
}
}

您不应该在
ConfigureServices
中调用
services.AddSingleton(配置)
。默认情况下,它已经在DI容器中

您只需在
控制器中引用它即可:

public class CreateController : Controller
{

    public IConfiguration _configuration;
    public CreateController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public IEnumerable<string> Get()
    {
        Markets();
    }

    public string Markets()
    {
        var connectionString = _configuration.GetConnectionString("ConnectionStringName");
        using( SqlConnection con = new SqlConnection(connectionString) )
        {
            return con.Database;
        }

    }
}
公共类CreateController:控制器
{
公共IConfiguration\u配置;
公共CreateController(IConfiguration配置)
{
_配置=配置;
}
公共IEnumerable Get()
{
市场();
}
公开市场()
{
var connectionString=_configuration.GetConnectionString(“ConnectionStringName”);
使用(SqlConnection con=newsqlconnection(connectionString))
{
返回con.数据库;
}
}
}

它为空,因为它尚未设置。您需要首先构建配置,这最好在构造函数中完成。正如其他人指出的那样,不建议这样做

范例

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        if (env.IsDevelopment())
        {
            builder.AddUserSecrets<Startup>();
        }

        Configuration = builder.Build();
    }

    private IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(Config);            
    }
}
公共类启动
{
公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
if(env.IsDevelopment())
{
builder.AddUserSecrets();
}
Configuration=builder.Build();
}
专用IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddSingleton(Config);
}
}

我注意到您的
启动
缺少构造函数。在ASP.NET Core 2中,当它调用startup(基于典型的
WebHost.CreateDefaultBuilder(args).UseStartup()
在一个普通
程序中时。BuildWebHost
)将自动将配置传递到启动构造函数中:

public class Startup
{
    public IConfiguration Configuration { get; }

    // This configuration is automatic, if WebHost.CreateDefaultBuilder(args) is used in Program.cs
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
只需添加它就可以解决IConfiguration为空的问题

现在,您不必将该配置添加到DI中,因为默认情况下,它应该已经存在于DI中,并且您可以按原样将其添加到控制器构造函数中。然而,这样做没有害处

最后,要加入合唱团,直接在控制器中使用IConfiguration不是一个好主意。而是研究强类型配置设置。有一些教程可以提供帮助-这是我找到的-但要点是你的控制器最终会看起来像这样:

public class CreateController : Controller
{
    public ConnectionStrings _ConnectionStrings;
    public CreateController(IOptions<ConnectionStrings> connectionStrings)
    {
        _ConnectionStrings = connectionStrings.Value;
        ...
公共类CreateController:控制器
{
公共连接字符串\u连接字符串;
公共CreateController(IOptions连接字符串)
{
_ConnectionString=ConnectionString.Value;
...

配置设置在哪里?您还应该阅读有关配置和设置的基础文档。建议不要将
IConfiguration
插入控制器。此外,这似乎是一个问题。您试图实现的最终目标是什么?基本上,我正试图从我的appsettings.json读取连接字符串你能把你的
Program.cs
课程包括在问题中吗?