2011-05-23 70 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

希望这些信息可以帮助别人。