首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义中间件Asp.Net-Core添加响应头

使用自定义中间件Asp.Net-Core添加响应头
EN

Stack Overflow用户
提问于 2018-03-08 01:13:00
回答 1查看 3.6K关注 0票数 2

我有3个微服务,并尝试创建关联id来跟踪每个日志问题。如果corrID在请求到来时不是null,那么我会设置它。如果不是,则生成它。然后传给下一个。我想查看3个服务的日志的corrId。如果我使用下面的代码,一切都很好。但swagger不起作用。

异常: headers为只读响应已启动。

代码语言:javascript
复制
 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

代码语言:javascript
复制
  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。我该如何处理这个问题?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-03-08 03:05:39

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

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

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49157646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档