1

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)

メッセージ自体は次のようになります。

public interface ILinkPersonMessage : IBaseMessage
{
    int PersonId { get; set; }
    List<int> UnitIds { get; set; }
}

public interface IBaseMessage
{
    int UserId { get; set; }
}

送信クラスでは、これを行っています。

var message = bus.CreateInstance<ILinkPersonMessage>();
message.UserId = currentUser.UserId;
message.PersonId = personId;
message.UnitIds = selectedUnits;

bus.Send(message);

アップデート:

NServiceBusコードを調べていますが、これがエラーをスローしているメソッドです。

    public string GetHeader(object message, string key)
    {
        if (message == ExtensionMethods.CurrentMessageBeingHandled)
            if (bus.CurrentMessageContext.Headers.ContainsKey(key))
                return bus.CurrentMessageContext.Headers[key];
            else
                return null;

        if (messageHeaders == null)
            return null;

        if (!messageHeaders.ContainsKey(message))
            return null;

        if (messageHeaders[message].ContainsKey(key))
            return messageHeaders[message][key];

        return null;
    }

そのコードを見ると、これは、bus.CurrentMessageContextまたはbus.CurrentMessageContext.Headersがnullの場合、またはmessageHeaders[message]存在しているがnull値が含まれている場合にのみ発生する可能性があります。残念ながら、これらのシナリオのどれがより可能性が高い(または可能でさえある)かをまだ理解できていません。

アップデート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>

アップデート3

これは、現在機能する流暢な構成です。

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();

(すべての名前空間をトリミングしました)

4

3 に答える 3

2

これは、プロセスの起動を送信した後の最初のメッセージで発生しますか、それとも後続のメッセージで発生しますか?

送信バスを複数回構成していますか?(NServiceBus.Configure?)

于 2012-05-07T23:30:35.573 に答える
1

最近、ヘッダー管理に関するいくつかのバグを修正したので、それがあなたが遭遇したものである可能性があります。3.0.4にアップグレードしてみて、問題が解決するかどうかを確認してください。

于 2012-05-11T19:16:06.237 に答える
1

同じことが私にも起こりました。問題は、サービスバスを構成するときにxmlserializationをセットアップするのを忘れたことでした。

var configBus = NServiceBus.Configure.With()
.DefaultBuilder()
.MsmqSubscriptionStorage()
.XmlSerializer() // <== This line here
.MsmqTransport()
    .IsTransactional(true)
    .PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(true);
于 2013-09-02T01:19:49.437 に答える