2014-12-01 62 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

相關問題