NServiceBus处理程序抛出元数据错误

时间:2016-10-19 02:39:55

标签: c# .net json rabbitmq nservicebus

将NServiceBus更新为上周发布的最新版本(也有新的实现)后,我发现从客户端发送json时出现了奇怪的错误。

我将从客户端发送消息,接收者显示以下消息:

  

2016-10-18 22:16:33.612 INFO MFG.Receiver.DeviceHandler收到ID为的信息:a222b136-6a4e-474e-8012-cc1c24e5e539

我的处理程序中有一个断点,如下所示,它显示消息对象已烘焙,不应出现任何问题。

public class DeviceHandler : IHandleMessages<DeviceRequest>
{
    private readonly IDeviceProvider _provider = new DeviceProvider();
    private static readonly ILog Log = LogManager.GetLogger<DeviceHandler>();

    public Task Handle(DeviceRequest message, IMessageHandlerContext context)
    {
        Log.Info($"Got message with id: {context.MessageId}");
        ...
        return context.SendLocal($"Message with Id {context.MessageId} received.");
    }
}

当它在最后点击回复方法时,会抛出以下错误:

  

2016-10-18 22:16:33.666 INFO NServiceBus.RecoverabilityExecutor立即重试将重试消息&#39; a222b136-6a4e-474e-8012-cc1c24e5e539&#39;因为一个例外:   System.Exception:找不到&#39; System.String&#39;的元数据。   确保以下内容:   1.&#39; System.String&#39;包含在初始扫描中。   2.&#39; System.String&#39;实现&#39; IMessage&#39;,&#39; IEvent&#39;或者&#39; ICommand&#39;或者,如果您不想实现界面,可以使用“不显眼的模式”。      位于C:\ Build \ src \ NServiceBus.Core \ Unicast \ Messages \ MessageMetadataRegistry.cs:第39行中的NServiceBus.Unicast.Messages.MessageMetadataRegistry.GetMessageMetadata(类型messageType)

我不确定为什么它会在处理程序收到消息后填充System.String错误并填充属性...

json 发送看起来像这样:

{
  "$type": "DeviceRequest, MFG.Domain",
  "Id": "devices-65",
  "DeviceId": 1,
  "Location": "Orlando",
  "DeviceType": "test"
}

My Sender(客户端)看起来像这样:

static void Main()
{
    ...
        using (var channel = connection.CreateModel())
        {
            var messageId = Guid.NewGuid().ToString();
            var properties = channel.CreateBasicProperties();
            properties.MessageId = messageId;

            var payload = GenerateJsonPayload();

            channel.BasicPublish(string.Empty, ServerEndpointName, false, properties, Encoding.UTF8.GetBytes(payload));
            Console.WriteLine($"Message with id {messageId} sent to queue.");
        }
     ...
}

public static string GenerateJsonPayload()
{
    var obj = new DeviceRequest
    {
        DeviceId = 1,
        DeviceType = "test",
        Location = "Orlando"
    };

    var settings = new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All
    };

    var result = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);

    return result;
}

我已经找不到元数据&#34;之前的问题,这是由于格式错误的json或没有类型。如果我删除了JsonSerializerSettings,并且只是传递了一个序列化对象,我就会收到错误:

  

2016-10-18 22:31:27.698 ERROR NServiceBus.RecoverabilityExecutor移动消息&#;; 6405179d-ea36-4264-af2a-704da19af120&#39;到错误队列&#39;错误&#39;因为处理因异常而失败:   NServiceBus.MessageDeserializationException:尝试从传输消息中提取逻辑消息时发生错误6405179d-ea36-4264-af2a-704da19af120 ---&gt; System.Exception:找不到&#39; Newtonsoft.Json.Linq.JObject&#39;的元数据。

我不知道我在这里失踪了什么,这不是以前版本的问题。这是一个错误还是......?

1 个答案:

答案 0 :(得分:3)

SendLocal操作使用具体的消息类型。

作为处理您正在执行的邮件return context.SendLocal($"Message with Id {context.MessageId} received.");的一部分。这将尝试将“string”类型的消息发送到本地队列。 NServiceBus告诉您没有为“string”的消息类型注册消息元数据。因此,它无法构造消息并抛出异常。