ABP多库支持

ABP支持多库的方案在abp的案例中aspnetboilerplate-samples中给了现成的demo,其中MultipleDbContextDemo是EF的相关针对dotnet的版本,MultipleDbContextEfCoreDemo则是dotnet core版本的多库方案

按照改demo的思路,添加我们的abp的多库支持,F5直接允许,一切ok,欣慰,没有报错。

按照业务要求,完成代码一切美美哒。

ABP多库发布后异常

发布正式环境,请求访问第二个数据库的相关接口,抛出“应用程序内部错误的异常”

查看唯一App_Data目录下的日志文件 发现抛出异常,“Could not find content root folder”

然后就是各种bing,百度,google一通搜,没有找到结果。

问题查找调试

本地发布了一个和正式环境一样的环境,手动去调试一下,想追到是什么地方抛出来的,找到我们应用的进程(dotnet core下不是W3W了,而是你应用的dll名称)。附加到进程,发现我擦怎么进不了断点,换个接口试一下,发现依旧进不来断点。

测试发现附加的时候比之前多了一个选择,有个coreCLR的选择如下图,不知道这个玩意是什么鬼,先去掉吧,点击选择,选中“自动选择要调试的代码类型”。然后再来附加,进断点了,为啥呢,没有深究!

接下来继续排除我们的多库报错问题

跟代码发现异常是从Core下面的WebContentDirectoryFinder.cs抛出来的,如下图

找到问题源头了,我们就看怎么怎么解决,看一下当前代码干了什么事情。

public static string CalculateContentRootFolder()
{
var coreAssemblyDirectoryPath = Path.GetDirectoryName(typeof(AiCoreModule).GetAssembly().Location);
if (coreAssemblyDirectoryPath == null)
{
throw new Exception("Could not find location of Chemical.Ai.Core assembly!");
} DirectoryInfo directoryInfo = new DirectoryInfo(coreAssemblyDirectoryPath);
while (!DirectoryContains(directoryInfo.FullName, "Chemical.Ai.sln"))
{
//发布状态下,应该为当前目录
if (directoryInfo.Parent == null)
{
return coreAssemblyDirectoryPath;
//throw new Exception($"Could not find content root folder!");
} directoryInfo = directoryInfo.Parent;
} var webMvcFolder = Path.Combine(directoryInfo.FullName, "src", "Chemical.Ai.Web.Mvc");
if (Directory.Exists(webMvcFolder))
{
return webMvcFolder;
} var webHostFolder = Path.Combine(directoryInfo.FullName, "src", "Chemical.Ai.Web.Host");
if (Directory.Exists(webHostFolder))
{
return webHostFolder;
} throw new Exception("Could not find root folder of the web project!");
} private static bool DirectoryContains(string directory, string fileName)
{
return Directory.GetFiles(directory).Any(filePath => string.Equals(Path.GetFileName(filePath), fileName));
}

代码翻译:当前代码就是从dll的所在目录一层层找,直到找到解决方案文件所在的目录,然后将解决方案所在的目录的上层目录(A)返回给下面的逻辑使用。而下面的逻辑就是从上层目录A开始往下找到src下面的mvc或者host目录,

也就是我们的应用启动目录,返回appsettings.json所在的目录。

异常原因:在F5的调试状态下,appsettings.json是位于mvc或host下面的。但是当我们发布后,appsettings.json就是当前启动目录了,dll和appsettings.json是并列的级别

,我们在发布状态下,根本没有解决方案,所以根据解决方案找appsettings.json的方案行不通,也就会抛出我们看到的异常。

解决方案:发布状态下,无需如此复杂的逻辑,直接返回程序运行目录就可以了,如下图

修改完成发布,运行,异常没有了,程序完美运行!

ABP在MultipleDbContext也就是多库的场景下发布后异常“Could not find content root folder”问题处理的更多相关文章

  1. 如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap"

    刚看到Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 看了下VS2013带来的"新特性",直觉上看,除了引 ...

  2. Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库

    本文主要描述Oracle备库日志与主库日志之间有gap,切主库这部分gap的归档日志已经删除或丢失,如何在不重建备库的情况下,恢复备库. 欢迎转载,请注明作者.出处. 作者:张正 blog:http: ...

  3. boost库在windows下的编译和使用

    因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...

  4. 如何使用开源库,吐在VS2013发布之前,顺便介绍下V2013的新特性"Bootstrap"

    如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" 刚看到Visual Studio 2013 Preview - ASP.NET, M ...

  5. C++标准库第二版笔记 3 和异常的理解 1

    C++标准库第二版笔记 3 和异常的理解 1 差错和异常(error and exception)的处理 标准异常类(exception class) 定义于 分为: 1.语言本身支持的异常 2.标准 ...

  6. wxWidgets与其他工具库的比较(下)

    2009-07-25 12:37:51   GTK+       ● GTK+的网站:www.gtk.org:     ● GTK+原本是Gimp的一个工具库,是在LGPL协议下发布的Unix系统GU ...

  7. CPPCMS库在Windows下的使用

    标题:CPPCMS库在Windows下的使用时间:2012-7作者:Kagula 环境:[1]WinXP SP3[2]VisualStudio2008 SP1[3]ZLib 1.2.7[4]PCRE ...

  8. C语言静态库与动态库(Windows下测试)

    转载于:https://zhidao.baidu.com/question/1946953913764139388.html,原文为Linux上测试,本文为在Windows上编译测试 我们通常把一些公 ...

  9. < python音频库:Windows下pydub安装配置、过程出现的问题及常用API >

    < python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分 ...

随机推荐

  1. javaweb学习总结(一) - - JSP取得绝对路径

    在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下: 例如: 1 <!--使用绝对路径的方式引入 ...

  2. php表单的种类

    1.text 2.color 3.date 4.datetime 5.email 6.month 7.number 8.range 9.search 10.tel 11.url 12.week 13. ...

  3. int 和bigint差别有多大?

    https://bbs.csdn.net/wap/topics/230059600 请问在mysql中int和bigint差别有多大?在什么情况下需要用到bigint? bigint 带符号的范围是- ...

  4. LeetCode108 Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. (M ...

  5. UVa-10986_Sending email (向前星+Dijkstra)

    题意:给你点.边,求起点到终点的最短距离. 题解:由于题目的数据量特别大,所以需要用邻接表来存边,之后对Dijkstra算法稍微魔改一下就可以了,本来以为会超时,做好了打堆优化的准备,结果卡时间过了, ...

  6. qt painter多个点的曲线

    plot.h #ifndef PLOT_H #define PLOT_H #include<QTimer> #include <QWidget> class pathplot ...

  7. deepin golang微服务搭建go-micro环境

    1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.cn # 使用如下指令安装 ...

  8. behavior planning——inputs to transition functions

    the answer is that we have to pass all  of the data into transition function except for the previous ...

  9. MaxCompute 预付费标准版VS套餐版

    MaxCompute 于5月7日正式售卖预付费(包年包月)套餐资源,主打存储密集型套餐,一共三个套餐: 存储密集型160套餐 存储密集型320套餐 存储密集型600套餐 本文主要给大家介绍预付标准版和 ...

  10. Google Colab——用谷歌免费GPU跑你的深度学习代码

    Google Colab简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究.这款工具现在可以免费使用,但是不是永久免费暂时还不确定.Google Col ...