我刚刚熟悉NServiceBus,我收到了MessageDeserialization异常和堆栈跟踪,如下所示 .
对于一些环境信息......我正在使用队列的azure持久性 . 我可以看到订阅表以及我的订阅者的所有 endpoints 地址 .
我有3个MVC Web API托管应用程序 . 发布导致此异常的消息的Service / API在其app.config中配置为订阅自身和其他2个api . 其他似乎没有问题的人只有1个订阅 . 第一个订阅了自己的一个事件 . 另一个订阅了来自3rd service / api的3个事件 .
我试过的东西是为了解决这个问题 . 我使用约定来定义我的事件,但现在我的事件消息都实现了IEvent . 我还定义了JsonSerializer . 这是我的总线配置设置......
public class NServiceBusEndpointConfig : IConfigureThisEndpoint, AsA_Worker
{
public static IBus bus;
public void Customize(BusConfiguration busConfig)
{
var configuration = ContainerConfig.Container.Resolve<ICredentialDomainConfig>();
busConfig.AzureConfigurationSource();
busConfig.UseTransport<AzureStorageQueueTransport>()
.ConnectionString(configuration.NServiceBusQueueConnectionString);
busConfig.UsePersistence<AzureStoragePersistence>();
busConfig.EndpointName("service1");
busConfig.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(ContainerConfig.Container));
busConfig.UseSerialization<JsonSerializer>();
busConfig.License(configuration.NServiceBusLicenseString);
}
}
}
这是异常和堆栈跟踪详细信息......
“NServiceBus.ExceptionInfo.ExceptionType”:“NServiceBus.MessageDeserializationException”,
“NServiceBus.ExceptionInfo.InnerExceptionType”:“System.Exception”,
“NServiceBus.ExceptionInfo.HelpLink”:null,
“NServiceBus.ExceptionInfo.Message”:“尝试从传输消息中提取逻辑消息时发生错误
8dea1c2f-babb-438d-8e4c-a4cd002f5ab6“,”NServiceBus.ExceptionInfo.Source“:”NServiceBus.Core“,”NServiceBus.ExceptionInfo.StackTrace“:”NServiceBus.MessageDeserializationException:尝试从传输消息中提取逻辑消息时发生错误8dea1c2f-babb-438d-8e4c-a4cd002f5ab6 ---> System.Exception:找不到'Newtonsoft.Json.Linq.JObject'的元数据 . \ r \ n请确保以下内容:\ r \ n1 . 'Newtonsoft.Json.Linq.JObject'包含在初始扫描中 . \ r \ N2 . 'Newtonsoft.Json.Linq.JObject'实现'IMessage','IEvent'或'ICommand',或者,如果你不想实现一个接口,你可以使用'Unobtrusive Mode' . \ r \ n在NServiceBus .Unicast.Messages.LogicalMessageFactory.Create(类型messageType,Object message,Dictionary2 headers)在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Unicast \ Messages \ LogicalMessageFactory.cs: System.Linq.Enumerable.ToList的System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext()\ r \ n在System.Linq.Enumerable.ToList的System.Collections.Generic.List1..ctor(IEnumerable1集合)\ r \ n的第59行\ r \ n TSource](IEnumerable1 source)\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Unicast \ Messages \ DeserializeLogicalMessagesBehavior中的NServiceBus.DeserializeLogicalMessagesBehavior.Extract(TransportMessage physicalMessage) . cs:第93行\ r \ n在NServiceBus.DeserializeLogicalMessagesBehavior.Invoke(IncomingContext上下文,Action next)中c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NSer viceBus.Core \ Unicast \ Messages \ DeserializeLogicalMessagesBehavior.cs:line 40 \ r \ n ---内部异常堆栈跟踪结束--- \ r \ n在NServiceBus.DeserializeLogicalMessagesBehavior.Invoke(IncomingContext context,Action next)在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Unicast \ Messages \ DeserializeLogicalMessagesBehavior.cs:第47行\ r \ n在NServiceBus.BehaviorChain1.InvokeNext(T context)中c :\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ r \ n在NServiceBus.BehaviorChain1 . <> c__DisplayClass5 . <InvokeNext> b__2()在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第95行\ r \ n位于c:\ BuildAgent \ work \中的NServiceBus.ApplyIncomingTransportMessageMutatorsBehavior.Invoke(IncomingContext上下文,Action next) 3206e2123f54fce4 \ src \ NServiceBus.Core \ MessageMutator \ ApplyIncomingTransportMessageMutatorsBehavior.cs:第20行\ r \ n位于c:\ BuildAgen中的NServiceBus.BehaviorChain1.InvokeNext(T context) t \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ r \ n在NServiceBus.BehaviorChain1 . <> c__DisplayClass5 . <InvokeNext> b__2()在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第95行\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \中的NServiceBus.SubscriptionReceiverBehavior.Invoke(IncomingContext上下文,Action next) \ src \ NServiceBus.Core \单播\订阅\ MessageDrivenSubscriptions \ SubscriptionReceiverBehavior.cs:第32行\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \中的NServiceBus.BehaviorChain1.InvokeNext(T上下文) NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ r \ n在NServiceBus.BehaviorChain1 . <> c__DisplayClass5 . <InvokeNext> b__2()在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus . Core \ Pipeline \ BehaviorChain.cs:第95行\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core中的NServiceBus.UnitOfWorkBehavior.Invoke(IncomingContext上下文,Action next) \的UnitOfWork \ UnitOfWorkB ehavior.cs:第42行\ n \ n在NServiceBus.BehaviorChain1.InvokeNext(T context)中c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ r \ n在NServiceBus.BehaviorChain1 . <> c__DisplayClass5 . <InvokeNext> b__2()在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第95行\ r \ n位于c:\ BuildAgent \ work \中的NServiceBus.ChildContainerBehavior.Invoke(IncomingContext context,Action next) \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Unicast \ Behaviors \ ChildContainerBehavior.cs:第17行\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \中的NServiceBus.BehaviorChain1.InvokeNext(T上下文) NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ r \ n在NServiceBus.BehaviorChain1 . <> c__DisplayClass5 . <InvokeNext> b__2()在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus . Core \ Pipeline \ BehaviorChain.cs:第95行\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core中的NServiceBus.ProcessingStatisticsBehavior.Invoke(IncomingContext上下文,Action next) \监控\ ProcessingStatisticsBehavior.cs:L在NServiceBus.BehaviorChain1的c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ n \ n \ n下的NServiceBus.BehaviorChain1.InvokeNext(T context)中的\ nNer 23 \ r \ n . < > c__DisplayClass5 . <InvokeNext> b__2()在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:line 95 \ r \ n在NServiceBus.AuditBehavior.Invoke (IncomingContext上下文,Action next)c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Audit \ AuditBehavior.cs:line 20 \ r \ n在NServiceBus.BehaviorChain1.InvokeNext(T在c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第107行\ r \ n,在c:\ BuildAgent \ work \ 3206e2123f54fce4中的NServiceBus.BehaviorChain1.Invoke() \ src \ NServiceBus.Core \ Pipeline \ BehaviorChain.cs:第58行\ r \ n位于NS:serviceBus.Pipeline.PipelineExecutor.Execute [T](BehaviorChain1 pipelineAction,T context)c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Pipeline \ PipelineExecutor.cs:第129行\ r \ n位于c:\ BuildAgent \ work \ 3206e2123f54fce4 \ src \ NServiceBus.Core \ Unicast \ Transport \ TransportReceiver.cs中的NServiceBus.Unicast.Transport.TransportReceiver.ProcessMessage(TransportMessage消息):第328行“,”NServiceBus.FailedQ“:” <<队列,
“NServiceBus.TimeOfFailure”:“2015-07-06 02:52:26:254996 Z”
这是请求的消息类...最初在消息中有3个不同的“信息”,但试图简化,所以现在只有事件中的权限信息...
public class CredentialPermissionGrantedEvent : IEvent
{
public PermissionInfo Permission { get; set; }
}
public class PermissionInfo
{
public Guid PermissionReference { get; set; }
public DateTime ActivationDate { get; set; }
public Guid CredentialReference { get; set; }
public Guid DeviceReference { get; set; }
public DateTime ExpirationDate { get; set; }
public string Function { get; set; }
public Guid ScheduleReference { get; set; }
public long Timestamp { get; set; }
}
任何帮助将不胜感激
- 保罗
2 回答
看起来json.net将您的消息反序列化为JObject而不是消息的类型,两个 endpoints 是否都知道相同的类型?如果查看邮件正文,是否包含必要的json.net元数据($ type)?
ServiceControl在发送消息进行重新处理时将其回调地址头(它发生在SQLServer和RabbitMQ传输中)添加到消息中
处理消息的处理程序调用Bus.Reply或Bus.Return
回复被路由到SC回调队列而不是实际目的地(在回复字段中设置)
查找更多指南here