首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NServicebus接收消息时不需要所有NServicebus特定的内容

NServicebus接收消息时不需要所有NServicebus特定的内容
EN

Stack Overflow用户
提问于 2022-07-20 17:12:42
回答 1查看 66关注 0票数 0

我是NServicebus新手,在文档中很难找到答案。

我正在尝试接收一条以简单JSON格式发布到Amazon的消息,如下所示:

代码语言:javascript
复制
"MyMessage": {
    "Id": 1,
    "Name": "Name",
    "Field1": "text",
    "Field2": 1,
    "Field3": false
}

然而,每当这被发送到队列时,我的NServicebus订阅者说它是一条有害消息,并不试图处理它。

我意识到这条消息丢失了很多NServicebus内容,因为当我通过NServicebus发布消息时,它看起来如下所示:

代码语言:javascript
复制
{
    "Headers": {
        "NServiceBus.MessageId": "a244a014-e331-41e6-b6ca-aed6011af905",
        "NServiceBus.MessageIntent": "Publish",
        "NServiceBus.ConversationId": "e42f0308-4c51-4787-ade0-aed6011af90f",
        "NServiceBus.CorrelationId": "a244a014-e331-41e6-b6ca-aed6011af905",
        "NServiceBus.OriginatingMachine": "DESKTOP-1234567",
        "NServiceBus.OriginatingEndpoint": "endpoint",
        "$.diagnostics.originating.hostid": "da7dce712dfbc0f093aa30eb7f25d2b4",
        "NServiceBus.ContentType": "application/json",
        "NServiceBus.EnclosedMessageTypes": "Type",
        "NServiceBus.Version": "7.7.3",
        "NServiceBus.TimeSent": "2022-07-18 17:10:16:400164 Z"
    },
    "Body": "Base 64 encoded string here",
    "S3BodyKey": null
}

问题是,我收到的消息不是通过NServicebus发布的,而是以我前面显示的格式发布的。它没有所有的标头和一个base64编码的主体。

是否有办法设置NServicebus以便能够接收和处理这样的消息?还是它不是专门用来处理这种事情的?

注意:这是一个.Net 6应用程序

编辑:我发现这篇文章提到了NServicebus如何在没有所有标题的情况下接收消息,但没有提到如何接收消息。

https://www.bradjolicoeur.com/Article/nsb-features-message-headers

EN

回答 1

Stack Overflow用户

发布于 2022-07-20 21:36:30

您想要的是本地发送,实际上是记录在案。您必须使您的消息符合NServiceBus所期望的格式,以便能够让处理程序正确地处理它。

本机发送函数如下所示:

代码语言:javascript
复制
public static async Task SendMessage(IAmazonSQS sqsClient, string queue, string messageBody, Dictionary<string, string> headers)
{
    var bodyBytes = Encoding.UTF8.GetBytes(messageBody);
    var base64Body = Convert.ToBase64String(bodyBytes);
    var serializedMessage = Newtonsoft.Json.JsonConvert.SerializeObject(new
    {
        Headers = headers,
        Body = base64Body,
    });
    var queueUrlResponse = await sqsClient.GetQueueUrlAsync(QueueNameHelper.GetSqsQueueName(queue));
    await sqsClient.SendMessageAsync(queueUrlResponse.QueueUrl, serializedMessage);
}

要使用它,您需要指定消息类型和其他一些标头值:

代码语言:javascript
复制
await SendMessage(
    sqsClient: client,
    queue: "samples-sqs-nativeintegration",
    messageBody: "{Property:'PropertyValue'}",
    headers: new Dictionary<string, string>
    {
        {"NServiceBus.EnclosedMessageTypes", "MessageTypeToSend"},
        {"NServiceBus.MessageId", "99C7320B-A645-4C74-95E8-857EAB98F4F9"}
    }
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73055704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档