首页 > 解决方案 > nservicebus 使用 msmq 传输发送具有列表类型属性的命令对象

问题描述

我有 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
};

最后我启动端点并尝试发送对象。. . 这就是我的问题所在

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在此处输入图像描述

标签: c#nservicebusmsmqdistributed-systemgeneric-list

解决方案


不幸的是,您没有提供消息的所有类型部分。

序列化过程中可能会发生一些事情,因为您正在分配序列化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
};

推荐阅读