在 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