寻找对此问题的一些见解。在我看来,所有配置似乎都符合预期,但每当我尝试运行 dotnet publish TestAPI.dll
并尝试访问端点时,我都会看到以下内容:
ArgumentNullException: Value cannot be null. Parameter name: connectionString Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(string value, string parameterName) Microsoft.EntityFrameworkCore.Infrastructure.RelationalOptionsExtension.WithConnectionString(string connectionString) Microsoft.EntityFrameworkCore.MySQLDbContextOptionsExtensions.UseMySQL(DbContextOptionsBuilder optionsBuilder, string connectionString, Action MySQLOptionsAction) TestAPI.Startup.b__4_0(DbContextOptionsBuilder options) in Startup.cs + options.UseMySQL(Configuration.GetConnectionString("DefaultConnection"))); Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions+<>c__DisplayClass0_0.b__0(IServiceProvider p, DbContextOptionsBuilder b) Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.DbContextOptionsFactory(IServiceProvider applicationServiceProvider, Action optionsAction) Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions+<>c__DisplayClass5_0.b__0(IServiceProvider p) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProvider provider) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor.VisitCallSite(IServiceCallSite callSite, TArgument argument)
当我从 IDE (Visual Studio for Mac) 运行应用程序时,我可以确认它按预期工作。这是我的相关配置:
appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "server=localhost;userid=root;pwd=root;port=3306;database=Expenses;sslmode=none;"
},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
//"Console": {
// "LogLevel": {
// "Default": "Warning"
// }
//}
}
}
appsettings.Development.json
{
"ConnectionStrings": {
"DefaultConnection": "server=localhost;userid=root;pwd=root;port=3306;database=Expenses;sslmode=none;"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using TestAPI.Data;
using TestAPI.Data.Models;
using System;
using Microsoft.Extensions.Logging;
namespace TestAPI
{
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.AddCors();
services.AddMvc();
services.AddDbContext<ExpensesDbContext>(options =>
options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<IBaseDa<Accounts>, AccountsDataAccess>();
services.AddTransient<IExpensesDa, ExpensesDa>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
env.EnvironmentName = "Development";
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
app.UseMvc();
}
}
}
Program.cs
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace TestAPI
{
public class Program
{
public static void Main(string[] args)
{
//var builder = new ContainerBuilder();
//// register types here for DI
//builder.RegisterType<AccountsDataAccess>().As<IBaseDa<Accounts>>();
//_container = builder.Build();
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
甚至尝试在相应的发布文件夹(例如 bin/Release/netcoreapp2.0/publish)中编辑 appsettings.Development.json 和 appsettings.json
非常感谢任何帮助!谢谢大家
最佳答案
试试这个,如果不起作用请告诉我。
startup.cs
namespace TestAPI
{
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
.
.
.
.
.
}
}
关于c# - 带有 MySQL DB 的 .NET Core 2.0 WebAPI - dotnet publish - 运行 .dll 时连接字符串为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50890877/