簡體   English   中英

nservicebus 使用 msmq 傳輸發送具有列表類型屬性的命令 object

[英]nservicebus send command object with list type property using msmq transport

我有 2 個 nservicebus 端點,一個端點正試圖發送一個命令(類)object,其中包含 3 個屬性,即 bool、List 和 class。 下面是完整的命令 class

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

下面是我如何填充 object 並且我已經確認所有屬性都包含有效值。 我只是簡化了一些代碼

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

最后我啟動端點並嘗試發送object。 . . 這就是我的問題所在

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 在此處輸入圖像描述

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

序列化過程中可能會發生一些事情,因為您將file.Body.ValidationReports分配給startProcess.ProcessFailures ,這會使序列化程序跳閘。

file.Body.ValidationReports中的類型是ProcessFailed類型還是繼承自它並擴展了 class? 如果是這樣,請嘗試將 map 這些結果添加到新的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
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM