将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;的元数据。
我不知道我在这里失踪了什么,这不是以前版本的问题。这是一个错误还是......?
答案 0 :(得分:3)
为SendLocal
操作使用具体的消息类型。
作为处理您正在执行的邮件return context.SendLocal($"Message with Id {context.MessageId} received.");
的一部分。这将尝试将“string”类型的消息发送到本地队列。 NServiceBus告诉您没有为“string”的消息类型注册消息元数据。因此,它无法构造消息并抛出异常。