ASP.NET Core 下MVC6程序的发布与启动:找不到appsettings.json配置文件
—— ASP.NET Core 踩坑日常(一)
听说最近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,我们再来确认一下:
- 没错,配置文件里的确有这一项!
- 从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
这个文件啊,我都看到了!聪明的同学:我知道了!果然跟上面提到的
Content Root Path
这个东西有关!!!
Content Root Path是什么?有什么用?
直接从cmd中运行
dotnet
命令时,我们注意到,命令提示符所在目录为C:\Users\UserName
而非程序发布目录,而启动程序时输出的Content Root Path
其实就是当前执行dotnet
命令的所在目录,应用程序寻找appsettings.json
配置文件的时候自然也就会从这里寻找,所以会找不到咯!
那么,正确的启动方式是什么呢?
- 切换到应用程序发布目录所在盘符
- 切换到应用程序发布目录
- 执行
dotnet
命令启动应用程序
以本文示例中的程序为例,bat文件内容如下:
D:
cd D:\Documents\momo314.visualstudio.com\AspNetCore.Keng\src\AspNetCore.Keng.Web\bin\Debug\PublishOutput
dotnet AspNetCore.Keng.Web.dll