ASP.NET Core 下MVC6程序的发布与启动:找不到appsettings.json配置文件

—— ASP.NET Core 踩坑日常(一)

momo314相同方式共享非商业用途署名转载

听说最近ASP.NET Core 1.0 RC2出来了,想着RC2应该挺稳定的了吧,于是打算,搞个ASP.NET Core的小东西尝尝鲜。。。。

于是新建了一个项目如下(正如本文副标题所说的,不要在意项目名称):

项目结构项目结构

都说了不要在意项目名称。。。

欧凯,现在我们把项目发布到一个本地目录:

发布目录发布目录

嗯,基本就是这样,我们先假装这就是我们的服务器,那么,就是 Program.cs 里面说好的 .UseKestrel(),现在我们该用Kestrel启动这个网站啦。

dotnet <项目dll的全路径名称>

在cmd中输入这个命令后,可以看到我们的项目已经正常启动了:

发布目录发布目录

但是,注意图中的蓝色部分,Content Root Path

这个东西有什么用呢?

别急,我们先来改几行代码。。。

//在 Startup.cs 中的 Configure 方法中加入如下代码来输出从配置文件中读取到的数据库连接字符串

loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

// 输出数据库连接字符串
var logger = loggerFactory.CreateLogger("Startup.Configure");
logger.LogDebug(Configuration["ConnectionStrings:DefaultConnection"]);

改好啦! 发布! 运行!

报错了!报错了!

竟然报错了!!!为毛!!!

看这个报错信息也只可能是 Configuration["ConnectionStrings:DefaultConnection"] 这个东西的问题了,OK,我们再来确认一下:

  1. 没错,配置文件里的确有这一项!
  2. 从appSettings.json里取值就是这么写的,绝不会错!

那么,就是读取不到这个配置咯?

配置文件:竟然敢怀疑到我头上!我就证明给你们看!(。・`ω´・)

// 将appsettings.json的读取修改为必选,不会因为找不到而忽略读取
var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false/*必须找到文件!*/, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

发布! 运行! 又!报!错!了!!!

找不到appsettings.json配置文件找不到appsettings.json配置文件

这次报错信息就清楚多了,果然就是因为没有找到appsettings.json 配置文件导致的,只不过因为之前设置为非必选项,所以导致找不到配置文件的时候程序不会报错而是选择忽略并继续运行,直到我们确实需要从配置文件中取值了才爆出错误

眼尖的同学:可是发布目录下明明就有 appsettings.json 这个文件啊,我都看到了!

聪明的同学:我知道了!果然跟上面提到的 Content Root Path 这个东西有关!!!

Content Root Path是什么?有什么用?

直接从cmd中运行 dotnet 命令时,我们注意到,命令提示符所在目录为 C:\Users\UserName 而非程序发布目录,而启动程序时输出的 Content Root Path 其实就是当前执行 dotnet 命令的所在目录,应用程序寻找 appsettings.json 配置文件的时候自然也就会从这里寻找,所以会找不到咯!


那么,正确的启动方式是什么呢?

  1. 切换到应用程序发布目录所在盘符
  2. 切换到应用程序发布目录
  3. 执行 dotnet 命令启动应用程序

以本文示例中的程序为例,bat文件内容如下:

D:
cd D:\Documents\momo314.visualstudio.com\AspNetCore.Keng\src\AspNetCore.Keng.Web\bin\Debug\PublishOutput
dotnet AspNetCore.Keng.Web.dll
✎﹏ 本文来自于 momo314和他们家的猫,文章原创,转载请注明作者并保留原文链接。