【问题标题】:How to insert a middleware in Azure Durable Functions如何在 Azure Durable Functions 中插入中间件
【发布时间】:2023-01-31 18:18:37
【问题描述】:

我想向 Azure Durable Functions v4 (.NET 6) 插入一个中间件,它从 HttpTrigger 获取相关 ID 并将其注册到记录器工厂,以便它在应用程序洞察中可见。反之亦然;将关联 ID 附加到所有传出请求。我确实有多个 Azure 函数(有些函数相互调用),所以我想通过其 CorrelationId 跟踪特定请求。

我试过指南herehere。但是它们都有 Program.cs 类并使用该类注册中间件。我只有启动,它看起来像这样:

public class Startup : FunctionsStartup
{
   public override void Configure(IFunctionsHostBuilder builder)
   {
       builder.Services
          .AddLogging()
          .AddHttpClient();
   }
}

如何创建一个解决方案,将相关 ID 获取/附加到请求/响应?

比如:...UseMiddleware<CorrelationIdFactory>()

【问题讨论】:

标签: .net azure azure-functions azure-durable-functions


【解决方案1】:

将中间件插入到 Azure Durable Functions,将相关 ID 附加到日志。

  1. 创建一个自定义中间件类来实现您要插入的中间件逻辑。
  2. 中间件应将 Func 作为输入并返回 Task。
  3. 在 Durable Functions 应用程序的启动类中注册中间件,使用 IApplicationBuilder 实例上的 Use 方法注册您的自定义中间件
    public class CorrelationIdMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<CorrelationIdMiddleware> _logger;
    
        public CorrelationIdMiddleware(RequestDelegate next, ILogger<CorrelationIdMiddleware> logger)
        {
            _next = next;
            _logger = logger;
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
            var correlationId = context.Request.Headers["CorrelationId"].FirstOrDefault();
            if (string.IsNullOrEmpty(correlationId))
            {
                correlationId = Guid.NewGuid().ToString();
            }
    
            using (_logger.BeginScope(new Dictionary<string, object>
            {
                ["CorrelationId"] = correlationId
            }))
            {
                context.Items["CorrelationId"] = correlationId;
                _logger.LogInformation("Correlation Id: {CorrelationId}", correlationId);
                await _next(context);
            }
        }
    }
    
    

    要使用中间件,您需要在Startup.cs 文件中注册它

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseMiddleware<CorrelationIdMiddleware>();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapFunctions();
        });
    }
    

    然后,您可以访问函数中的相关 ID,如下所示

    
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log,
        ExecutionContext context)
    {
        var correlationId = req.HttpContext.Items["CorrelationId"].ToString();
        log.LogInformation("Correlation Id: {CorrelationId}", correlationId);
    
    }
    

    对于请求,您可以将关联 ID 添加到标头中,如下所示。

    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("CorrelationId", correlationId);
    var response = await client.GetAsync("https://sample.com");
    

    参考资料取自

    Durable Functions

    Functions in an isolated worker process

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多