尝试远程连接到.net核心API时,ConnectionString的ArgumentNullException

时间:2019-01-27 22:54:58

标签: c# .net-core

首先,这是在Mac中发生的,我是dotnet core的新手。

我已经安装了docker,并在dotnet core中设置了所有内容。我确实在'appsettings'和'appsettings(Development)'中添加了连接字符串。

"ConnectionStrings": {
    "Default": "server=localhost; database=Monitor; User ID=sa; Password=MyComplexpPassword!234;"
  },

这是Program.cs文件的主要方法

 public static void Main(string[] args)
 {
      CreateWebHostBuilder(args).Build().Run();
 }

这是startup.cs类的ConfigureServices方法。

public void ConfigureServices(IServiceCollection services)
{
      services.AddAutoMapper();

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

      services.AddDbContext<MonitorDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default")));

            // In production, the Angular files will be served from this directory
      services.AddSpaStaticFiles(configuration =>
      {
           configuration.RootPath = "ClientApp/dist";
      });

      services.AddScoped<IUserRepository,UserRepository>();
 }

这是用于测试API的Controller测试方法。

[HttpGet("getUser")]
public UserResource GetUserInfo()
{
       var user_1 = new User();

       user_1.FirstName = "MAC";
       user_1.LastName = "OS TEST";
       user_1.Username = "Apple@gmail.com";


       return mapper.Map<User, UserResource>(user_1);
}

如果我进行了一次休息呼叫(http)而没有设置Program.cs类进行远程访问,则此方法将完美执行。

enter image description here

现在,我已将其设置为在“ http://0.0.0.0:6001”中运行,以便可以从手机或同一台wifi中的另一台PC访问API。 我关注了This instructions

现在,我的Program.cs主要方法是这样的。

public static void Main(string[] args)
{
       // CreateWebHostBuilder(args).Build().Run();

       var configuration = new ConfigurationBuilder()
                .AddCommandLine(args)
                .Build();


       var hostUrl = configuration["hosturl"];
            if (string.IsNullOrEmpty(hostUrl))
                hostUrl = "http://0.0.0.0:6000";


       var host = new WebHostBuilder()
                .UseKestrel()
                .UseUrls(hostUrl)   // <!-- this 
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseConfiguration(configuration)
                .Build();

            host.Run();

}

在终端中,我运行了此命令dotnet run --hosturl http://0.0.0.0:6001

如果尝试访问与发生此事件之前相同的方法。 enter image description here

注意:-我只更改了主机,因为我需要与其他设备一起测试API。

我还有其他控制器和方法正在连接到数据库并使用它进行原始操作,这些API调用也面临着同样的问题。仅当我将其设置为远程访问时,这种情况才会发生。

注意:-如果我这样更改Startup.cs类的连接字符串行,它将在两种配置中均能正常工作。

services.AddDbContext<MonitorDbContext>(options => options.UseSqlServer("server=localhost; database=Monitor; User ID=sa; Password=MyComplexpPassword!234;"));

但是我觉得这不是一个好习惯。将来,我必须将JWT身份验证添加到API,以便还需要将APP_Secret添加到AppSettings.json文件中。

谢谢。

2 个答案:

答案 0 :(得分:3)

您没有告诉应用程序使用appsettings.json。更改以下配置

var configuration = new ConfigurationBuilder()
    .AddCommandLine(args)
    .Build();

收件人

var configuration = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddCommandLine(args)
    .Build();

答案 1 :(得分:0)

或者,您可以使用静态WebHost.CreateDefaultBuilder方法,该方法默认情况下从“ appsettings.json”,“ appsettings。[EnvironmentName] .json”,命令行加载设置args。

注意->如here所述:

  

AddCommandLine已被CreateDefaultBuilder调用。如果你   需要提供应用配置,并且仍然能够覆盖该配置   使用命令行参数进行配置,请调用应用程序的其他   ConfigureAppConfiguration中的提供者并最后致电AddCommandLine

WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        // Call other providers here and call AddCommandLine last.
        config.AddCommandLine(args);
    })
    .UseStartup<Startup>();