【问题标题】:Adding Response Headers with Custom Middleware Asp.Net-Core使用自定义中间件 Asp.Net-Core 添加响应标头
【发布时间】:2018-08-15 21:26:42
【问题描述】:

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

例外:标头是只读响应已经开始。

 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);
                }

            }

为了解决招摇问题,我使用此链接更改最后一个 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);
    }

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

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    正确的方法是在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);
    

    【讨论】:

    • 我已经为此苦苦挣扎了好几个小时,无论出现 500 个错误,我都无法让标题始终出现在响应中。 context.Response.OnStarting() 永远不会在出现异常的情况下被触发,以 hello world 为例。即使在异常情况下也应该调用context.Response.OnStarting 吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 2021-12-12
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2021-09-19
    相关资源
    最近更新 更多