gpt4 book ai didi

c# - 使用自定义中间件 Asp.Net-Core 添加响应 header

转载 作者:行者123 更新时间:2023-11-30 23:04:46 25 4
gpt4 key购买 nike

我有 3 个微服务,并尝试创建相关 ID 来跟踪每个日志问题。如果请求到来时 corrID 不为空,则我设置它。如果没有,则生成它。然后传给下一个。我想查看 3 个服务日志的 corrId。如果我使用下面的代码,一切都会很好。但招摇是行不通的。

异常: header 是只读的,响应已开始。

 public async Task Invoke(HttpContext context)
{
string key = context.Request.Headers.Keys.FirstOrDefault(n => n.Equals("Correlation-ID"));

var corrID = context.RequestServices.GetService<CorrelationID_Global>();

if (corrID != null)
{
if (!string.IsNullOrWhiteSpace(key))
{

corrID.ID = context.Request.Headers[key].ToString();
}
else
{
corrID.ID = Guid.NewGuid().ToString();

}
}

await _next(context);

if (!string.IsNullOrWhiteSpace(corrID?.ID))
{
context.Response.Headers.Add("Correlation-ID", corrID.ID);
}

}

为了解决 swagger 问题,我使用此链接更改了最后一个 if 语句: Add Response Headers to ASP.NET Core Middleware

  if (!string.IsNullOrWhiteSpace(corrID?.ID))
{
context.Response.OnStarting((state) =>
{
context.Response.Headers.Add("Correlation-ID", corrID.ID);
return Task.FromResult(0);
},null);
}

但是,这次我在服务的响应日志中看不到corrID。因此请求日志的corrID 照常发生变化。我该如何处理这个问题?谢谢。

最佳答案

正确的方法是在 await _next(context); 之前注册 context.Response.OnStarting 回调,因为管道中的下一个中间件之一将启动响应。

换句话说,在当前的实现中,您的 OnStarting 回调不会被触发,因为注册得太晚了。将中间件代码更改为

if (!string.IsNullOrWhiteSpace(corrID?.ID))
{
context.Response.OnStarting((state) =>
{
context.Response.Headers.Add("Correlation-ID", corrID.ID);
return Task.FromResult(0);
}, context);
}

await _next(context);

关于c# - 使用自定义中间件 Asp.Net-Core 添加响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49157646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com