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

tom*_*ern 6 nservicebus

背景:

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

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

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

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

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

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

Jen*_*s H 13

好吧,异常会告诉你它到底是什么.它正在寻找一些实现IConfigureThisEndpoint的类.

我想到了三件事:

  • 你忘了实现它(看看NServiceBus样本)
  • 您实施了它,但您的课程不是公开的内部的
  • 您的文件所在的文件夹或子文件夹中有多个程序集,用于实现IConfigureThisEndpoint
  • 您的程序集的框架版本与NServiceBus程序集之间存在不匹配,即您正在使用为.NET 3.5编译的NServiceBus,但Visual Studio 2010将您的端点(默认情况下)创建为.NET 4.0.(David Boike补充说)
  • 失败订户引用的消息DLL是延迟签名的.这导致它失败并显示"No endpoint configuration found ..."错误.在本地构建一个强大的命名版本的消息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>
Run Code Online (Sandbox Code Playgroud)

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

最后一点也发生在我身上.它重命名我的程序集后没有清理项目目录.然后,NServiceBus遍历所有文件并找到旧的命名程序集和新命名的程序集,并以相同的异常结束.

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

[编辑]

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

[编辑2]

添加了更多信息NServiceBus.Host.exe.config.