Объект команды отправки nservicebus со свойством типа списка с использованием транспорта msmq - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть 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 enter image description here

1 Ответ

0 голосов
/ 20 апреля 2020

К сожалению, вы не предоставляете все типы части вашего сообщения.

Возможно, что-то происходит во время сериализации, потому что вы назначаете 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
};
...