我有3个微服务,并尝试创建关联id来跟踪每个日志问题。如果corrID在请求到来时不是null,那么我会设置它。如果不是,则生成它。然后传给下一个。我想查看3个服务的日志的corrId。如果我使用下面的代码,一切都很好。但swagger不起作用。
异常: headers为只读响应已启动。
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);
}但是,这次我在responses‘log of services.Thus corrID of requests’log changes中看不到responses Id。我该如何处理这个问题?谢谢。
发布于 2018-03-08 03:05:39
正确的方法是在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);https://stackoverflow.com/questions/49157646
复制相似问题