c# - 带有 MySQL DB 的 .NET Core 2.0 WebAPI - dotnet publish - 运行 .dll 时连接字符串为空

标签 c# mysql asp.net-core-2.0 asp.net-core-webapi

寻找对此问题的一些见解。在我看来,所有配置似乎都符合预期,但每当我尝试运行 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/

相关文章:

c# - Visual Studio 可扩展性 - 每个 Visual Studio 版本的不同 MEF 导出?

c# - 从字符串中获取数字和字符串

mysql - 如何在 MySql EFCore 中从 2 个外键创建主键

c# - 如何在 .NET Core 2.1 中重现复杂参数的 [FromUri] 行为

c# - System.Text.Json:如何使用接口(interface)属性反序列化类(.NET 6)

c# - Dllimport 将字符串从 C# 传递到 C++

mysql - 根据列分隔记录

java - Java中的客户端服务器聊天应用程序

php - 如何在 html 中为数据库表的列使用复选框?

asp.net-core - 使用Postman测试.net core 2页面返回400错误请求