【发布时间】:2020-05-21 10:25:10
【问题描述】:
我一直在努力使用 serilog 记录响应正文有效负载数据,从中间件记录。 我正在开发 WEB API Core 应用程序,将 swagger 添加到端点,我的目标是将每个端点调用记录到 .json带有 serilog 的文件(请求和响应数据)。
对于 GET 请求,应记录响应正文(作为属性添加到 serilog 上下文中),对于 POST 请求,应记录请求正文和响应正文。 我创建了中间件并设法从请求和响应流中正确检索数据,并将其作为字符串获取,但只有 "RequestBody" 被正确记录。
调试时,我可以看到读取请求/响应正文工作正常。
以下是 Program->Main 方法的代码摘录:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();
以及中间件中的代码:
public async Task Invoke(HttpContext context)
{
// Read and log request body data
string requestBodyPayload = await ReadRequestBody(context.Request);
LogContext.PushProperty("RequestBody", requestBodyPayload);
// Read and log response body data
var originalBodyStream = context.Response.Body;
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
await _next(context);
string responseBodyPayload = await ReadResponseBody(context.Response);
if (!context.Request.Path.ToString().EndsWith("swagger.json") && !context.Request.Path.ToString().EndsWith("index.html"))
{
LogContext.PushProperty("ResponseBody", responseBodyPayload);
}
await responseBody.CopyToAsync(originalBodyStream);
}
}
private async Task<string> ReadRequestBody(HttpRequest request)
{
HttpRequestRewindExtensions.EnableBuffering(request);
var body = request.Body;
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
string requestBody = Encoding.UTF8.GetString(buffer);
body.Seek(0, SeekOrigin.Begin);
request.Body = body;
return $"{requestBody}";
}
private async Task<string> ReadResponseBody(HttpResponse response)
{
response.Body.Seek(0, SeekOrigin.Begin);
string responseBody = await new StreamReader(response.Body).ReadToEndAsync();
response.Body.Seek(0, SeekOrigin.Begin);
return $"{responseBody}";
}
正如我提到的,"RequestBody" 已正确记录到文件中,但 "ResponseBody" 没有任何内容(甚至没有添加为属性) 感谢任何帮助。
【问题讨论】:
标签: asp.net-core asp.net-core-webapi serilog asp.net-core-middleware