首页 > 解决方案 > 如何在 Masstransit 中发布消息之前添加自定义标头

问题描述

在将消息发布到队列之前,我正在尝试在消息中添加额外的标头。我无法在创建总线控件时添加 UseSendFilter() 和 UseConsumeFilter() 请在下面找到消息有效负载和总线配置。请注意目标框架是dotnet v4.8

有效载荷:

using System;
using MassTransit;

namespace Payload
{
    public interface IPublishMessage : CorrelatedBy<Guid>
    {
        string Name { get; set; }
        DateTime TimeStamp { get; set; }
        string Sender { get; set; }
        QueueType QueueType { get; set; }
        MessageType MessageType { get; set; }
        ContentType ContentType { get; set; }
        string Content { get; set; }
    }
}

出版商:

 var busControl = Bus.Factory.CreateUsingAzureServiceBus(busFactoryConfigurator =>
            {
                busFactoryConfigurator.Host(new Uri(Config.ConnectionString), host =>
                {
                    host.OperationTimeout = TimeSpan;
                    //TODO Add Token Provider
                });

                busFactoryConfigurator.UseSendContext()

                busFactoryConfigurator.SendTopology.UseCorrelationId<IPublishMessage>(x => x.CorrelationId);
                // TODO Add Headers from IPublishMessage
                // TODO Refer https://masstransit-project.com/advanced/middleware/scoped.html

                busFactoryConfigurator.Message<IPublishMessage>(topologyConfigurator =>
                {
                    topologyConfigurator.SetEntityName(Config.TopicExchange);
                });
            });

            await busControl.StartAsync(CancellationTokenSource.Token);
            await busControl.Publish(message.Content, CancellationTokenSource.Token);
            await busControl.StopAsync(CancellationTokenSource.Token);

我想将有效负载中的以下属性添加到标头:

string Name { get; set; }
        DateTime TimeStamp { get; set; }
        string Sender { get; set; }
        QueueType QueueType { get; set; }
        MessageType MessageType { get; set; }
        ContentType ContentType { get; set; }

标签: c#masstransit

解决方案


文档中介绍了在发布​​/发送消息时添加标头。

在您的示例中:

await busControl.Publish(message.Content, context =>
{
    context.Headers.Set("QueueType", message.QueueType.ToString());
    context.Headers.Set("MessageType", message.MessageType.ToString());
    // etc.
    
}, CancellationTokenSource.Token);

推荐阅读