可怕的“扫描组件中找不到端点配置”NServiceBus错误

时间:2011-05-23 09:03:22

标签: nservicebus

背景:

  • 我的解决方案中有两个NServiceBus端点项目。
  • 两者都是NServiceBus订阅者,并包含一条消息的消息处理程序。
  • 每个订阅者项目处理来自两个不同发布者之一的消息。因此,一个项目引用来自一个发布者的消息DLL,另一个项目引用来自另一个发布者的消息DLL。
  • 两个发布商都在我的解决方案之外。
  • 除了消息DLL之外,两个订阅者项目都引用了NServiceBus的相同二进制文件,并且还具有完全相同的设置(UnicastBusConfig,EndpointConfig,appSettings等)

一个订阅者项目运行正常,但另一个订阅者项目失败并出现此错误:

未处理的异常:System.InvalidOperationException:在扫描的程序集中找不到端点配置。当NServiceBus无法加载包含IConfigureThisEndpoint的程序集时,通常会发生这种情况。尝试使用appsetting键在NServiceBus.Host.exe.config中显式指定类型:EndpointConfigurationTypeScanned path: my path here    在NServiceBus.Host.Program.ValidateEndpoints(IEnumerable`1 endpointConfigurationTypes)    在NServiceBus.Host.Program.GetEndpointConfigurationType()    在NServiceBus.Host.Program.Main(String [] args)

我怀疑问题必然在于订户的NServiceBus发布者消息DLL无法启动。但是,我不知道如何弄清楚这有什么问题。我看过了:

  • 两个NServiceBus发布者消息DLL的清单使用ildasm并且它们是相同的(关于处理器标志和引用的NServiceBus DLL版本)。
  • NSB消息项目,它们都是使用.Net 3.5 Framework构建的。

我在这里疯了,已经烧了差不多一天试图让这个工作。任何帮助都会受到大力赞赏。

5 个答案:

答案 0 :(得分:13)

嗯,异常会告诉你它究竟是什么。 它正在寻找一些实现 IConfigureThisEndpoint 的类。

我想到了三件事:

  • 您忘了实施它(看看NServiceBus样本)
  • 您已实施,但您的课程不是 公开 内部
  • 您在 或子文件夹 文件夹中有 多个 程序集,文件位于该文件夹中 IConfigureThisEndpoint
  • 您的程序集的框架版本与NServiceBus程序集之间存在不匹配,即您正在使用为.NET 3.5编译的NServiceBus,但Visual Studio 2010将您的端点(默认情况下)创建为.NET 4.0。 (由 David Boike 添加的点)
  • 失败订阅者引用的消息DLL是延迟签名的。这导致它失败并显示“No endpoint configuration found ...”错误。在本地构建一个强大的命名版本的消息DLL解决了这个问题。 (由 thecolour 添加的点)
  • 由于许多不同的原因,似乎抛出了“No endpoint config ...”异常,并且它掩盖了实际原因。该例外基本上只说配置无法发现,它没有指明问题的原因是什么。 (由 thecolour 添加的点)
  • 我们使用的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然后遍历所有文件并找到旧的命名程序集和新命名的程序集,并以相同的异常结束。

请注意,如果包含相同接口实现的第二个程序集位于子文件夹内,则可能会导致错误。这种行为引起了一些调试问题,因为我以前将我的文件作为短期备份复制到子文件夹...

[编辑]

编辑以在此主题中添加其他作者的其他项目以获得完整性。

[编辑2]

添加了有关NServiceBus.Host.exe.config

的更多信息

答案 1 :(得分:4)

在我的情况下,我有这个例外,因为我使用了来自NServiceBus安装路径的 NServiceBus.Host.exe 。将其更改为bin / debug copy(在两种情况下:服务器和客户端),程序开始正确。 项目属性 - &gt;调试 - &gt;启动外部程序 - &gt; bin / debug文件夹中NServiceBus.Host.exe的完整路径

答案 2 :(得分:1)

确定一个真正的脸庞时刻 - 失败的订阅者引用的消息DLL只是延迟签名。这导致它失败并显示“No endpoint configuration found ...”错误。一旦我在本地构建了一个强大的命名版本的消息DLL,它解决了这个问题。

我认为“无端点配置...”异常似乎因为许多不同的原因而被抛出,并且它掩盖了实际原因。有人知道诊断这类问题的好方法吗?

答案 3 :(得分:1)

当项目的构建属性设置为在x86的平台目标上运行时,我也看到了类似的东西。

我最初使用输出类型的控制台应用程序设置项目,导致它使用x86的平台目标创建。

我后来将项目类型更改为类库(但无法将平台类型更改为“任何CPU”)。

将平台目标更改为任何CPU使其开始工作。

答案 4 :(得分: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.msi

在我们的特殊情况下,我们必须从http://www.microsoft.com/en-US/download/details.aspx?id=42317

获取sdk的2.3版本

希望这些信息有助于某人。