从2.6升级到3.0后NServiceBus模拟问题

时间:2012-03-13 14:14:52

标签: .net nservicebus

我刚刚从NSB 2.6升级到3.0,并且我在提出传输消息时遇到NSB抛出ArgumentNullException的问题:

NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] <(null)> - 
Failed raising 'transport message received' event for message with ID=21d502f4-0e66-4d1e-801c10ddc1cbe40a\34416
        System.ArgumentNullException: Value cannot be null.
        Parameter name: name
           at System.Security.Principal.GenericIdentity..ctor(String name)
           at NServiceBus.Impersonation.ImpersonationManager.Transport_TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e)
           at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
           at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg)

该方案是一个Web应用程序,它将消息发送到当前托管在控制台中的端点(但将作为Windows服务运行)。

网络应用的配置:

Configure.WithWeb()
    .Log4Net()
    .DefaultBuilder()
    .XmlSerializer()                                    
    .MsmqTransport()
        .IsTransactional(false)
        .PurgeOnStartup(false)
    .UnicastBus()
        .ImpersonateSender(false)
        .CreateBus()
    .Start();

端点使用生产配置文件并具有以下配置:

   Configure.With()
        .StructureMapBuilder()
        .Sagas()
        .RunTimeoutManager()
        .UnicastBus()
           .ImpersonateSender(false)

正如您所看到的,模拟在Web应用程序和端点中都被关闭(升级之前我没有在端点上配置Impersonation),但是NSB仍在尝试模拟,并且失败了因为消息头中的WinIdName为空。

问题是,为什么NSB在配置为不这样做时会尝试冒充,以及自2.6以来发生了什么变化导致突然失败?

编辑:在我进一步调查时,看起来它尝试在将消息发送到端点时尝试模拟Web应用的用户,即使它已配置为不这样做。

1 个答案:

答案 0 :(得分:2)

这是2个问题。一个是如果由于某种原因身份为空,我们就会爆炸。

现已修复(将在NSB 3.0.1中推出)

https://github.com/NServiceBus/NServiceBus/commit/eaaafecbbedc7c82d996ce466434038d70bc27cd

另一个是角色As_aServer覆盖了ImpersonateSender(false)。这是一个更大的变化。解决方法是不使用角色,只手动配置相同的设置:

https://github.com/NServiceBus/NServiceBus/blob/master/src/hosting/NServiceBus.Hosting.Windows/Roles/Handlers/ServerRoleHandler.cs