我刚刚从 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 应用程序和端点中均已关闭(在升级之前,我没有在端点上配置模拟),但 NSB 仍在尝试模拟,但失败了因为消息头中的 WinIdName 为空。
问题是,为什么 NSB 在配置为不这样做的情况下却试图进行模拟,以及自 2.6 以来发生了什么变化导致模拟突然失败?
编辑:当我进一步调查时,它似乎在将消息发送到端点时尝试模拟 Web 应用程序的用户,即使它被配置为不这样做。
最佳答案
这是 2 个问题。一是如果身份由于某种原因为空,我们就会爆炸。
此问题现已修复(将在 NSB 3.0.1 中推出)
https://github.com/NServiceBus/NServiceBus/commit/eaaafecbbedc7c82d996ce466434038d70bc27cd
另一个是角色As_aServer 覆盖了ImpersonateSender(false)。这是一个更大的改变。解决方法是不使用该角色,而仅手动配置相同的设置:
关于.net - 从 2.6 升级到 3.0 后出现 NServiceBus 模拟问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9685771/