asp.net Azure服务总线隔离函数中间件-将相关ID添加到ServiceBusReceivedMessage

fv2wmkja  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(60)

我想了解在中间件中修改ServiceBusReceivedMessage的相关ID属性的可能性和方法。如果这无法实现,我愿意接受替代建议,以执行在实际函数之前提到的操作。
.NET 6隔离函数v4

public class MiddlewareA : IFunctionsWorkerMiddleware
    {
        public Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
        {
            // access the ServiceBusReceivedMessage, evaluate its properties like 
            // correlationId and update if it does not exist
            return next.Invoke(context);
        }
    }

字符串

zte4gxcn

zte4gxcn1#

目前,您无法将CorrelationID修改为Azure Service Bus只读属性。这是其属性的一部分。它类似于Content TypeToReplyTo**,就像其他类型的消息模式一样。
但是,您可以将包括CorrelationID在内的服务总线属性格式化,并在代码中将其传递给输出消息,如Github Issue1Github Issue2Github Issue3中所引用的
下面是我的自定义中间件记录的CorrelationID,您可以使用此CorrelationId在您的输出消息如下:-

我的CorrelationIdMiddleware.cs:-

using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Middleware;
using Microsoft.Extensions.Logging;

namespace FunctionApp66
{
    public class CorrelationIdMiddleware : IFunctionsWorkerMiddleware
    {
        private readonly ILogger<CorrelationIdMiddleware> _logger;

        public CorrelationIdMiddleware(ILogger<CorrelationIdMiddleware> logger)
        {
            _logger = logger;
        }

        public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
        {
            if (context.BindingContext.BindingData.TryGetValue("ServiceBusTrigger", out var triggerData)
                && triggerData is ServiceBusReceivedMessage receivedMessage)
            {
                if (receivedMessage.ApplicationProperties.ContainsKey("CorrelationId"))
                {
                    var correlationId = (string)receivedMessage.ApplicationProperties["CorrelationId"];

                    // Log the correlation ID without modifying the message
                    _logger.LogInformation("Correlation ID: {correlationId}", correlationId);
                }
            }

            await next(context);
        }
    }
}

字符串

我的Function1.cs:-

using System;
using Azure.Messaging.ServiceBus;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace FunctionApp66
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function(nameof(Function1))]
        public void Run([ServiceBusTrigger("myqueue", Connection = "myqueue")] ServiceBusReceivedMessage message)
        {
            _logger.LogInformation("Message ID: {id}", message.MessageId);
            _logger.LogInformation("Message Body: {body}", message.Body);
            _logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);
            _logger.LogInformation("Message Content-Type: {contentType}", message.CorrelationId);
        }
    }
}

我的程序.cs:-

using FunctionApp66;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
        services.AddSingleton<CorrelationIdMiddleware>();

    })
    .Build();

host.Run();

输出:-

x1c 0d1x的数据

相关问题