nservicebus使用msmq传输发送具有列表类型属性的命令对象

问题描述 投票:0回答:1

我有2个nservicebus端点,一个端点正在尝试发送包含3个属性(即bool,List和class)的命令(类)对象。下面是完整的命令类]

public class StartProcess : ICommand
{
    public bool CanStartProcess { get; set; }
    public List<ProcessFailed> ProcessFailures { get; set; } = new List<ProcessFailed>();
    public ProcessFailed ProcessFailed { get; set; }
}

下面是我填充对象的方式,并且我已经确认所有属性都包含有效值。我只是将代码简化了一点]

var startProcess = new StartProcess()
{
    CanStartProcess = true,
    ProcessFailures = file.Body.ValidationReports,
    ProcessFailed = file.Body.ValidationReport
};

最后,我启动端点并尝试send对象。 。 。这是我的问题所在

ClaimsProcessorEndpoint.Start();
ClaimsProcessorEndpoint.EndpointInstance.Send(ConfigurationManager.AppSettings["ClaimsManager.Endpoint"], startProcess ).GetAwaiter().GetResult();

注意:当我删除列表属性时,一切正常。我收到以下异常:

exception.Message => The given key was not present in the dictionary.

exception.StackTrace
   at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key)
   at NServiceBus.XmlSerialization.Write(XElement elem, Type t, Object obj)
   at NServiceBus.XmlSerialization.WriteObject(XElement elem, String name, Type type, Object value, Boolean useNS)
   at NServiceBus.XmlSerialization.WriteEntry(XElement elem, String name, Type type, Object value)
   at NServiceBus.XmlSerialization.Write(XElement elem, Type t, Object obj)
   at NServiceBus.XmlSerialization.WriteObject(XElement elem, String name, Type type, Object value, Boolean useNS)
   at NServiceBus.XmlSerialization.WriteEntry(XElement elem, String name, Type type, Object value)
   at NServiceBus.XmlSerialization.Write(XElement elem, Type t, Object obj)
   at NServiceBus.XmlSerialization.WriteObject(XElement elem, String name, Type type, Object value, Boolean useNS)
   at NServiceBus.XmlSerialization.Serialize()
   at NServiceBus.XmlMessageSerializer.Serialize(Object message, Stream stream)
   at NServiceBus.SerializeMessageConnector.Serialize(IOutgoingLogicalMessageContext context)
   at NServiceBus.SerializeMessageConnector.<Invoke>d__1.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NServiceBus.UnicastSendRouterConnector.<Invoke>d__1.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()

查看NServicebus教程(图像),这应该没有问题。在两个端点上,我都使用XmlSerializer enter image description here

c# nservicebus msmq distributed-system generic-list
1个回答
0
投票

很遗憾,您没有在邮件中提供所有类型的部分。

由于您将file.Body.ValidationReports分配给使串行器跳闸的startProcess.ProcessFailures,因此在序列化期间可能会发生某些事情。

file.Body.ValidationReports中的类型是ProcessFailed类型还是继承自它并扩展了该类?如果是这样,请尝试将这些结果映射到新的ProcessFailed对象。

含义

var startProcess = new StartProcess()
{
    CanStartProcess = true,
    ProcessFailures = file.Body.ValidationReports.Select(x=>new ProcessFailed{A=x.A, B=x.B}).ToList(),
    ProcessFailed = file.Body.ValidationReport
};
© www.soinside.com 2019 - 2024. All rights reserved.