【问题标题】:asp.net core mvc log request bodyasp.net core mvc 日志请求体
【发布时间】:2018-03-03 20:53:14
【问题描述】:

我想用方法、路径、正文和其他信息记录传入的请求。我的问题是,在记录我需要的控制器后,控制器只得到一个空变量作为方法参数。我正在使用 .net core 1.1、IIoggerFactory、Serilog 扩展和以下中间件方法:

public async Task Invoke(HttpContext context)
    {  
        StringValues sessionId;
        var session = string.Empty;
        if (context.Request.Headers.TryGetValue("X-SessionID", out sessionId))
        {
            session = sessionId.FirstOrDefault();
            if (session != null) 
            {
                var requestBodyStream = new MemoryStream();
                var originalRequestBody = context.Request.Body;

                await context.Request.Body.CopyToAsync(requestBodyStream);
                requestBodyStream.Seek(0, SeekOrigin.Begin);

                var url = UriHelper.GetDisplayUrl(context.Request);
                var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd();
                _logger.LogDebug($"{session} {context.Request.Method} {url} {requestBodyText}");

                requestBodyStream.Seek(0, SeekOrigin.Begin);
                context.Request.Body = requestBodyStream;

                await _next(context);
                context.Request.Body = originalRequestBody;
            }
        }
        await _next(context);
    }

如何记录请求并在中间件之后为控制器保留请求正文?

【问题讨论】:

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

记录传入请求的解决方案很好,我只是在方法结束时忘记了一个 else。工作代码:

public async Task Invoke(HttpContext context)
    {  
        StringValues sessionId;
        var session = string.Empty;
        if (context.Request.Headers.TryGetValue("X-SessionID", out sessionId))
        {
            session = sessionId.FirstOrDefault();
            if (session != null) 
            {
                var requestBodyStream = new MemoryStream();
                var originalRequestBody = context.Request.Body;

                await context.Request.Body.CopyToAsync(requestBodyStream);
                requestBodyStream.Seek(0, SeekOrigin.Begin);

                var url = UriHelper.GetDisplayUrl(context.Request);
                var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd();
                _logger.LogInformation($"{session} {context.Request.Method} {url} {requestBodyText}");

                requestBodyStream.Seek(0, SeekOrigin.Begin);
                context.Request.Body = requestBodyStream;

                await _next.Invoke(context);
                context.Request.Body = originalRequestBody;
            }
        } else {
            await _next.Invoke(context);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2021-10-14
    • 2019-02-12
    • 2020-02-06
    • 2020-11-15
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多