I';当使用NserviceBus主机接收消息时,我在MessageHeaderManager.GetHeader中收到NullReferenceException

I';当使用NserviceBus主机接收消息时,我在MessageHeaderManager.GetHeader中收到NullReferenceException,nservicebus,Nservicebus,我正在使用NServiceBus 3,当我收到消息时,我从接收端点收到此错误: NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] <(null)> - Failed raising 'transport message received' event for message with ID=97d0f2fa-6227-439b-ad37-a304bd2af000\10428 Syst

我正在使用NServiceBus 3,当我收到消息时,我从接收端点收到此错误:

NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] <(null)> - Failed raising 'transport message received' event for message with ID=97d0f2fa-6227-439b-ad37-a304bd2af000\10428
System.NullReferenceException: Object reference not set to an instance of an object.
   at NServiceBus.MessageHeaders.MessageHeaderManager.GetHeader(Object message, String key)
   at NServiceBus.MessageHeaders.Bootstrapper.<Run>b__0(Object msg, String key)
   at NServiceBus.ExtensionMethods.GetHeader(Object msg, String key)
   at NServiceBus.ExtensionMethods.GetOriginatingSiteHeader(Object msg)
   at NServiceBus.Gateway.HeaderManagement.GatewayHeaderManager.MutateIncoming(Object message)
   at NServiceBus.Unicast.UnicastBus.<>c__DisplayClass25.<ApplyIncomingMessageMutatorsTo>b__24(IMutateIncomingMessages m)
   at System.Collections.Generic.List`1.ForEach(Action`1 action)
   at NServiceBus.Unicast.UnicastBus.ApplyIncomingMessageMutatorsTo(IBuilder builder, Object originalMessage)
   at NServiceBus.Unicast.UnicastBus.<>c__DisplayClass22.<HandleMessage>b__21(Object msg)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at NServiceBus.Unicast.UnicastBus.HandleMessage(IBuilder builder, TransportMessage m)
   at NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg)
   at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg)
通过查看该代码,只有当
bus.CurrentMessageContext
bus.CurrentMessageContext.Headers
为空,或者如果存在
messageHeaders[message]
但包含空值时,才会发生这种情况。不幸的是,我还没有弄清楚哪种情况更可能(甚至可能)

更新2

因此,我使用QueueExplorer拉出了标题:

<?xml version="1.0"?>
<ArrayOfHeaderInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <HeaderInfo>
        <Key>NServiceBus.Version</Key>
        <Value>3.0.3</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.TimeSent</Key>
        <Value>2012-05-08 06:57:15:691208 Z</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.EnclosedMessageTypes</Key>
        <Value>Namespace.Service.ILinkPersonMessage __impl, NServiceBus.Unicast.Transport__impl, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;Namespace.Service.ILinkPersonMessage, Namespace.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>WinIdName</Key>
        <Value>*{myusername}*</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>CorrId</Key>
    </HeaderInfo>
</ArrayOfHeaderInfo>

NServiceBus.Version
3.0.3
NServiceBus.TimeSent
2012-05-08 06:57:15:691208 Z
NServiceBus.EnclosedMessageTypes
Namespace.Service.ILinkPersonMessage _impl,NServiceBus.Unicast.Transport _impl,版本=0.0.0.0,区域性=中性,PublicKeyToken=null;Namespace.Service.ILinkPersonMessage,Namespace.Service,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null
WinIdName
*{myusername}*
科里德
更新3

这是目前可用的fluent配置:

Configure.With()
.DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("Events"))
.DefiningCommandsAs(t => t.Namespace != null && t.Namespace.StartsWith("Messages"))
.CastleWindsorBuilder(container)
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.IsolationLevel(IsolationLevel.ReadUncommitted)
.UnicastBus()
.RavenSagaPersister()
.RavenSubscriptionStorage()
.UseRavenTimeoutPersister()
.RunTimeoutManager()
.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install();
Configure.With()
.DefiningEventsAs(t=>t.Namespace!=null&&t.Namespace.StartsWith(“事件”))
.DefiningCommandsAs(t=>t.Namespace!=null&&t.Namespace.StartsWith(“消息”))
.CastleWindsorBuilder(集装箱)
.XmlSerializer()
.MsmqTransport()
.IsTransaction(真)
.IsolationLevel(IsolationLevel.ReadUncommitted)
.UnicastBus()
.RavenSagaPersister()
.RavenSubscriptionStorage()文件
.UserAventTimeOutpersister()文件
.RunTimeoutManager()
.ForInstallationOn().Install();

(我已修剪了所有名称空间)

这是在发送进程启动后的第一条消息上发生的,还是仅在后续消息上发生的


您是否多次配置发送总线?(NServiceBus.Configure?

这是在发送进程启动后的第一条消息上发生的,还是仅在随后的消息上发生的


您是否多次配置发送总线?(NServiceBus.Configure?

我们最近修复了一些有关头管理的错误,因此这可能就是您遇到的问题。请尝试升级到3.0.4,看看这是否解决了您的问题。

我们最近修复了一些有关标头管理的错误,因此您可能遇到了这些问题。请尝试升级到3.0.4,看看这是否解决了您的问题。

同样的事情发生在我身上,问题是我在配置服务总线时忘记设置xmlserialization

var configBus = NServiceBus.Configure.With()
.DefaultBuilder()
.MsmqSubscriptionStorage()
.XmlSerializer() // <== This line here
.MsmqTransport()
    .IsTransactional(true)
    .PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(true);
var configBus=NServiceBus.Configure.With()
.DefaultBuilder()
.MsmqSubscriptionStorage()

.XmlSerializer()//同样的事情也发生在我身上,问题是我在配置服务总线时忘记设置xmlserialization

var configBus = NServiceBus.Configure.With()
.DefaultBuilder()
.MsmqSubscriptionStorage()
.XmlSerializer() // <== This line here
.MsmqTransport()
    .IsTransactional(true)
    .PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(true);
var configBus=NServiceBus.Configure.With()
.DefaultBuilder()
.MsmqSubscriptionStorage()

.XmlSerializer()//是否正在配置web发件人-配置.WithWeb()?是的,它是web发件人,收件人正在运行NserviceBus.Host。我不认为我不止一次配置了发送者,我看不到超过一个IConfigureThisEndpoint实现者。它发生在每条消息上,而不仅仅是第一条消息。在这种情况下,web发送者在每次调用时都调用var bus=NServiceBus.Configure.WithWeb().Blah().Blah()。这导致第一条消息具有所需的头(接收器正常),但后续消息没有,从而导致(接收器上)非常类似的堆栈跟踪。“bus.Send()”的“bus”是从哪里来的?它正在被注入到MVC控制器中,Singleton的生活方式您是否正在配置web发送器-配置。WithWeb()?是的,它是web发送器,接收器正在运行NserviceBus.Host。我不认为我不止一次配置了发送者,我看不到超过一个IConfigureThisEndpoint实现者。它发生在每条消息上,而不仅仅是第一条消息。在这种情况下,web发送者在每次调用时都调用var bus=NServiceBus.Configure.WithWeb().Blah().Blah()。这导致第一条消息具有所需的头(接收器正常),但后续消息没有,从而导致(接收器上)非常类似的堆栈跟踪。“bus.Send()”的“bus”是从哪里来的?它被注入到MVC控制器的依赖项中,singletonFYI的生活方式:我看不出丢失的头是如何导致NRE的,但是堆栈跟踪中的NServiceBus.ExtensionMethods.GetOriginagingSiteHeader()正在寻找“NServiceBus.OriginagingSite”头,因此,如果我将.UnicastBus()添加到fluent配置中,它将开始工作,即使当服务启动时,它告诉我UnicastBus已在容器中注册。我想我还是不太明白到底发生了什么你能发布整个fluent配置吗?仅供参考:我看不出丢失的头怎么会导致NRE,但是堆栈跟踪中的NServiceBus.ExtensionMethods.GetOriginatingSiteHeader()正在寻找“NServiceBus.OriginatingSite”头,因此,如果我将.UnicastBus()添加到fluent配置中,它将开始工作,即使当服务启动时,它告诉我UnicastBus已在容器中注册。我想我还是不太明白幕后到底发生了什么你能发布整个fluent配置吗?
Configure.With()
.DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("Events"))
.DefiningCommandsAs(t => t.Namespace != null && t.Namespace.StartsWith("Messages"))
.CastleWindsorBuilder(container)
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.IsolationLevel(IsolationLevel.ReadUncommitted)
.UnicastBus()
.RavenSagaPersister()
.RavenSubscriptionStorage()
.UseRavenTimeoutPersister()
.RunTimeoutManager()
.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install();
var configBus = NServiceBus.Configure.With()
.DefaultBuilder()
.MsmqSubscriptionStorage()
.XmlSerializer() // <== This line here
.MsmqTransport()
    .IsTransactional(true)
    .PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(true);