2014-12-01 61 views
0

tldr - NServiceBus.Host.exe劫持我在调试模式下的app.configNServiceBus主机控制台使用错误应用程序配置

当使用配置管理器,我不能够访问的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); 
     } 
    } 
} 

变量“网址”回来空。 变量'config'曾经是此应用程序的配置上下文。 变量'nsbHostConfig'是应用程序的实际配置上下文。

此外,配置的预期路径是“EnrollmentService.Reporting.dll.config”,但实际路径是“NServiceBus.Host.exe.config”。 NServiceBus配置文件不存在。

这似乎是一个机器特有的问题,因为它按预期工作,在其他机器上使用“* .dll.config”。

这是有道理的,我认为这最终调用代码可执行文件应为“运行”应用程序的配置,但以前,它是用预期的* .dll.config。对我而言,NServiceBus会更改配置上下文,因为出于调试目的,主机作为控制台应用程序运行,但对于部署,它作为Windows服务安装。无论何时需要开发,都需要将您的配置文件交换出去,这将是愚蠢的。

为什么我的自主应用程序的操作环境切换到使用NServiceBus可执行文件的配置?

UPDATE:

下面,是什么应该发生,但它不是

https://github.com/Particular/NServiceBus.Host/blob/develop/src/NServiceBus.Hosting.Windows/EndpointTypeDeterminer.cs

望着NServiceBus源代码,如果没有指定您的EndpointType被在你的app.config中,EndpointTypeDeterminer.cs通过程序集扫描找到你的EndpointType类型为IConfigureThisEndpoint。

public string EndpointConfigurationFile 
{ 
    get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, type.Assembly.ManifestModule.Name + ".config"); } 
} 

该配置文件路径,然后通过System.AppDomainSetup用来调用System.AppDomain.CreateDomain

+0

我了解您的修改内容,但我不清楚这是否会回答您的问题。是否有不同的端点,不允许类型确定器识别正确的程序集?我对根本原因感兴趣。 – 2014-12-01 21:38:35

+0

它不回答我的问题,我看到什么**应该发生在源代码中,但这不是发生了什么。我仍在寻找更多相关信息。我会尝试明天进入NServiceBus.Host.exe。它也发生在我们代码库中的多个端点上,但仅限于我的机器上。 – SpykeBytes 2014-12-01 22:19:47

+0

我一直在尝试将NuGet软件包中的端点和外观分离出来,并消耗这些内容,而不是采用单一的解决方案。这可能与它有关。 – SpykeBytes 2014-12-01 22:25:21

回答

0

好吧,我已经找到了问题。这一个是一个愚蠢的。简而言之,配置更换是一个红鲱鱼。

在将我的一些端点分成单独的解决方案并创建NuGet包时,我将从属关系的版本号从104.1.0递增到105.0.1。

其余锐利改变了RestClient的签名。 BaseUrl成为Uri而不是字符串。

我在这个端点的构造函数中创建了ConfigurationAccessService的一个实例,它在它的构造函数中创建了一个RestClient。

现在,NServiceBust.Host将创建一个EndpointConfig TWICE的实例。首先,试试它,并获取一些元数据。其次,要实际使用。直到第二个实例,配置才被换出。

因此,当RestSharp升级时,第一个实例失败,因为没有appSettings。预期的appSetting为null,并且您不能用空字符串初始化Uri,它会抛出异常。意味着服务每次都会启动失败。

1
:然后,它通过调用它找到的类型下面的代码查找路径到app.config文件“正在运行”的应用程序的

配置文件,而不使用dll的配置。

你如何调用你的服务?使用NServiceBus.Host.exe?然后,该exe的配置文件将一直使用。从dll的配置复制所有的设置,并将它们粘贴到exe的配置文件,使其工作。如果exe文件的配置没有在应用程序文件夹提出创建它。

+0

它完全有意义,它应该使用NServiceBus.Host.exe.config文件。复制EnrollmentService.Reporting.dll.config并重命名NServiceBus.Host.exe.config可以工作,但是,我的组织中的其他每台机器都使用* .dll.config工作。我不知道这是否是一些NServiceBus魔法,但我认为是这样。我在机器上改变了一些东西导致了这个问题。 – SpykeBytes 2014-12-01 16:51:58

+0

这些机器是否运行EnrollmentService.Reporting.dll.config?他们如何“运行”这个DLL? – Hash 2014-12-01 16:57:41

+0

我通过在Visual Studio 2012中的调试模式下启动一个新实例来在本地运行我的服务。 服务通过使用以下内容安装在计算机上: NServiceBus.Host.exe/install/sc /serviceName:"EnrollmentService.Reporting“ I相信国安局使用OWIN自我主机:http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api – SpykeBytes 2014-12-01 16:58:44

相关问题