tldr - NServiceBus.Host.exe在调试模式下劫持了我的app.config
使用配置管理器时,我无法访问我在其中调用代码的项目的appSettings。
我正在使用NServiceBus主机nuget包,版本4.4.2
的自托管主机namespace EnrollmentService.Reporting
{
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
public EndpointConfig()
{
//TODO: WHAT IS HAPPPEEENNIIINNNGG
var url = ConfigurationManager.AppSettings["configurationKey"];
var config = ConfigurationManager.OpenExeConfiguration("EnrollmentService.Reporting.dll");
var nsbHostConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
}
}
变量'url'返回null。 变量'config'曾经是此应用程序的配置上下文。 变量'nsbHostConfig'是应用程序的实际配置上下文。
同样,配置的预期路径是“EnrollmentService.Reporting.dll.config”,但实际路径是“NServiceBus.Host.exe.config”。 NServiceBus配置文件不存在。
这似乎是一个特定于机器的问题,因为它在预期的情况下工作,使用其他机器上的“* .dll.config”。
对我来说,最终调用代码的可执行文件应该是“正在运行”的应用程序的配置是有意义的,但之前,它使用了预期的* .dll.config。我也有理由认为NServiceBus会改变配置上下文,因为出于调试目的,主机作为控制台应用程序运行,但对于部署,它作为Windows服务安装。无论何时需要开发,都需要在bin中交换配置文件,这是愚蠢的。
为什么我的自托管应用程序的操作上下文切换到使用NServiceBus可执行文件的配置?
更新:
下面,应该发生什么,但不是
查看NServiceBus源代码,如果您的app.config中未指定EndpointType,则EndpointTypeDeterminer.cs将通过程序集扫描找到您的EndpointType,类型为IConfigureThisEndpoint。然后通过调用它找到的类型上面的代码来找到app.config文件的路径:
public string EndpointConfigurationFile
{
get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, type.Assembly.ManifestModule.Name + ".config"); }
}
然后通过System.AppDomainSetup使用该配置文件路径来调用System.AppDomain.CreateDomain
答案 0 :(得分:1)
"运行"的配置文件使用的是app,而不是dll的配置。
您如何调用您的服务?使用NServiceBus.Host.exe?然后将一直使用该exe的配置文件。从dll的配置中复制所有设置并将其粘贴到exe的配置文件中以使其正常工作。如果应用程序文件夹中没有exe配置,请创建它。
答案 1 :(得分:0)
好的,我发现了问题。这个是一个很糟糕的。简而言之,配置交换是一个红色的鲱鱼。
在将一些端点分离为单独的解决方案并创建NuGet包时,我将依赖项RestSharp的版本号从104.1.0增加到105.0.1。
Rest sharp改变了它的RestClient的签名。 BaseUrl变成了Uri而不是字符串。
我在这个端点的构造函数中创建了一个ConfigurationAccessService实例,它在它的构造函数中创建了一个RestClient。
现在,NServiceBust.Host将创建一个EndpointConfig TWICE实例。首先,只是尝试一下,并获得一些元数据。第二,要实际使用。在第二个实例之前,配置不会被换出。
因此,当RestSharp升级时,第一个实例失败,因为没有appSettings。预期的appSetting为null,并且您无法使用空字符串初始化Uri,它将引发异常。这意味着服务每次都会失败启动。