2011-05-23 74 views
6

背景「沒有終點的掃描組件中的配置」:可怕的NServiceBus錯誤

  • 我在溶液中的兩種NServiceBus端點項目。
  • 兩者都是NServiceBus訂戶,並且包含一條消息的消息處理程序。
  • 每個訂閱者項目處理來自兩個不同發佈者之一的消息。因此,一個項目引用來自一個發佈者的消息DLL,另一個引用另一個發佈者的消息DLL。
  • 這兩個發佈者都在我的解決方案之外。從消息的DLL
  • 除了,無論訂戶項目中引用爲NServiceBus相同二進制文件,並且附加有相同的設置(UnicastBusConfig,EndpointConfig,的appSettings等)

一個訂戶項目運行良好,但另一方一個失敗,出現此錯誤:

未處理的異常:System.InvalidOperationException:在掃描的程序集中找不到端點配置。這通常發生在NServiceBus無法加載包含IConfigureThisEndpoint的程序集時。嘗試使用appsetting鍵在NServiceBus.Host.exe.config明確指定類型:EndpointConfigurationTypeScanned路徑:我這裏路徑 在NServiceBus.Host.Program.ValidateEndpoints(IEnumerable`1 endpointConfigurationTypes) 在NServiceBus.Host.Program。 GetEndpointConfigurationType() at NServiceBus.Host.Program.Main(String [] args)

我懷疑這個問題必須出現在用戶無法啓動的NServiceBus發佈者消息DLL中。 Howerver,我不知道如何解決這個問題。使用反彙編

  • 兩個NServiceBus出版商的消息DLL的體現,他們是相同的(至於引用處理器的標誌和NServiceBus DLL版本):我已經看過了。
  • NSB消息項目,它們都是使用.Net 3.5 Framework構建的。

我在這裏瘋了,已經燒了差不多一天,試圖讓這個工作。任何幫助將大規模讚賞。

回答

13

那麼,例外告訴你到底是什麼。 它正在尋找一些類實現IConfigureThisEndpoint

三樣東西來我的腦海:

  • 你忘了實現它(看看在NServiceBus樣品)
  • 你實現它,但你的類不公共內部
  • 您有多個集的文件夾中或子文件夾在您的文件位於實現IConfigureThisEndpoint
  • 你有你的組件的框架版本和NServiceBus組件之間的不匹配,也就是你使用NServiceBus編譯。 NET 3.5,但Visual Studio 2010將您的端點(默認情況下)創建爲.NET 4.0。 (點加大衛博克
  • 故障訂戶引用的消息DLL是延遲簽名的。這會導致它失敗,並顯示「找不到端點配置...」錯誤。構建強大的命名版本的消息DLL本地解決了該問題。 (點加
  • 「沒有端點配置...」異常似乎是由於許多不同的原因引發的,它掩蓋了實際原因。這個例外基本上只是說配置不能被發現,它沒有說明問題的最初原因是什麼。 (點加
  • 我們使用的NServiceBus版本不是針對.NET v4編譯的。所以我們需要創建一個配置文件NServiceBus.Host.exe.config配置要使用的.NET版本。
    • 不要忘了將上述提到的NServiceBus.Host.exe.config文件複製到屬性窗口中的/ bin/Debug文件夾中。發生在我身上所有的時間... ;-)

NServiceBus.Host.exe.config文件應該是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" /> 
    </startup> 
    <runtime> 
     <loadFromRemoteSources enabled="true" /> 
    </runtime> 
</configuration> 

我認爲「無端點配置...「異常似乎是由於許多不同的原因而引發的,它掩蓋了實際原因。任何人都知道診斷這類問題的好方法嗎?

最後一點也發生在我身上。它在重命名我的程序集並且不清除項目目錄後發生。然後NServiceBus運行所有文件並找到舊的命名程序集和新命名的程序集,並以相同的異常結束。

請注意,如果包含相同接口實現的第二個程序集位於子文件夾內,可能會導致錯誤,也會發生這種情況。這種行爲引起了一些調試頭痛,因爲我之前已經將我的文件作爲短期備份複製到子文件夾中...

[編輯]

編輯由其他作者在這個線程添加其他物品的完整性。

[EDIT 2]

增加了更多的信息有關NServiceBus.Host.exe.config

+0

感謝您的回覆。我知道你的意思是很容易忘記一些簡單而基本的東西。我實際上意識到這是因爲消息彙編只是延遲簽名。爲了迴應您的帖子,我認爲第二個要點是無效的,因爲IConfigureThisEndpoint實施不需要公開。可以是內部的。 – 2011-05-23 10:59:47

+0

你是對的,它可能是內部的。我剛剛檢查過它,並添加了編輯的第二個項目符號。 – 2011-05-23 12:35:59

+1

如果您的程序集的框架版本與NServiceBus程序集之間存在不匹配的情況,即您正在使用爲.NET 3.5編譯的NServiceBus,但Visual Studio 2010已將您的端點(默認情況下)創建爲.NET 4.0,則也會發生這種情況。 – 2011-05-23 14:03:12

1

確定一個真實的人臉掌上時刻 - 失敗用戶所引用的消息DLL只有延遲簽名。這導致它失敗,並顯示「沒有發現端點配置...」錯誤。一旦我在本地構建了強大的命名版本的消息DLL,它就解決了這個問題。

我認爲「沒有端點配置...」異常似乎是由於許多不同的原因引發的,它掩蓋了實際原因。任何人都知道診斷這類問題的好方法嗎?

+2

這個異常似乎是真的,因爲有問題的程序集無法加載,因此顯然無法找到IConfigureThisEndpoint接口。我猜NServiceBus本身可能會有麻煩來給出更精確的診斷,因爲錯誤已經發生在非常低​​的水平上:程序集無法加載 - >只有很少的信息可用。 :-) – 2011-05-23 12:17:45

1

當項目的構建屬性設置爲在x86平臺目標上運行時,我也看到類似的東西。

我最初使用一個輸出類型的控制檯應用程序來設置項目,它導致它使用x86平臺目標創建。

我稍後將項目類型更改爲類庫(但未能將平臺類型更改爲「任何CPU」)。

將平臺目標更改爲任何使其開始工作的CPU。

4

在我的情況下,我有這個例外,因爲我使用NServiceBus安裝路徑中的NServiceBus.Host.exe。將其更改爲bin/debug副本(在這兩種情況下:服務器和客戶端)後,程序開始正確。 項目屬性 - >調試 - >啓動外部程序 - 在斌/ debug文件夾>完整路徑NServiceBus.Host.exe

+0

需要注意的是,這種工作原因是因爲主機啓動時會掃描它所在的目錄。在安裝路徑中,不會有任何實現「IConfigureThisEndpoint」的類。當你將它移動到bin時,它會找到實現。 – 2013-10-21 21:29:10

1

找到一個額外的場景可能導致此異常當前未包括在接受的答案中。它特定於使用Azure作爲NServiceBus傳輸/持久性機制。

Azure SDK未正確安裝時,我們也發生了此錯誤。(這是如何發生的?如果您獲得最新版本的SDK,平臺安裝程序會很好,但是否則單獨安裝SDK組件會導致錯過組件。)

深入細節:Fusion Log指出NServiceBus.Host.exe無法解析Microsoft.WindowsAzure.ServiceRuntime。

的解決方案是安裝以下所有組件(需要爲了得到解決所有的依賴甚至模擬器)的:

  • WindowsAzureStorageTools.msi
  • WindowsAzureEmulator-x64.exe程序
  • WindowsAzureTools.vs120.exe
  • WindowsAzureAuthoringTools-x64.msi
  • WindowsAzureLibsForNet-x64。微星

在我們paricular情況下,我們必須得到2.3版本從SDK的:http://www.microsoft.com/en-US/download/details.aspx?id=42317

希望這些信息可以幫助別人。