.net core webapi 는 미들웨어 를 통 해 요청 과 응답 내용 을 가 져 오 는 방법

5298 단어 .netcorewebapi
본 고 는 주로 미들웨어 에 따라.net core webapi에서 발생 하 는 요청 과 응답 데 이 터 를 가 져 오고 로그 파일 에 저장 합 니 다.
로그 파일 의 사용 을 자세히 소개 하지 않 습 니 다.NLog,log4net,Exceptionless 등에 직접 접속 할 수 있 습 니 다.
인터페이스 기록 을 만 드 는 미들웨어

using Microliu.Core.Loggers;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Internal;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ptibro.Partner.API.Extensions
{
  public class RequestResponseLoggingMiddleware
  {
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;
    private SortedDictionary<string, object> _data;
    private Stopwatch _stopwatch;
    public RequestResponseLoggingMiddleware(RequestDelegate next, ILogger logger)
    {
      _next = next;
      _logger = logger;
      _stopwatch = new Stopwatch();
    }
    public async Task Invoke(HttpContext context)
    {
      _stopwatch.Restart();
      _data = new SortedDictionary<string, object>();
      HttpRequest request = context.Request;
      _data.Add("request.url", request.Path.ToString());
      _data.Add("request.headers", request.Headers.ToDictionary(x => x.Key, v => string.Join(";", v.Value.ToList())));
      _data.Add("request.method", request.Method);
      _data.Add("request.executeStartTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
      //     body  
      if (request.Method.ToLower().Equals("post"))
      {
        //       ,     Request.Body       
        request.EnableRewind();
        Stream stream = request.Body;
        byte[] buffer = new byte[request.ContentLength.Value];
        stream.Read(buffer, 0, buffer.Length);
        _data.Add("request.body", Encoding.UTF8.GetString(buffer));
        request.Body.Position = 0;
      }
      else if (request.Method.ToLower().Equals("get"))
      {
        _data.Add("request.body", request.QueryString.Value);
      }
      //   Response.Body  
      var originalBodyStream = context.Response.Body;
      using (var responseBody = new MemoryStream())
      {
        context.Response.Body = responseBody;
        await _next(context);
        _data.Add("response.body", await GetResponse(context.Response));
        _data.Add("response.executeEndTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
        await responseBody.CopyToAsync(originalBodyStream);
      }
      //              
      context.Response.OnCompleted(() =>
      {
        _stopwatch.Stop();
        _data.Add("elaspedTime", _stopwatch.ElapsedMilliseconds + "ms");
        var json = JsonConvert.SerializeObject(_data);
        _logger.Debug(json, "api", request.Method.ToUpper());
        return Task.CompletedTask;
      });
    }
    /// <summary>
    ///       
    /// </summary>
    /// <param name="response"></param>
    /// <returns></returns>
    public async Task<string> GetResponse(HttpResponse response)
    {
      response.Body.Seek(0, SeekOrigin.Begin);
      var text = await new StreamReader(response.Body).ReadToEndAsync();
      response.Body.Seek(0, SeekOrigin.Begin);
      return text;
    }
  }
  /// <summary>
  ///      
  /// </summary>
  public static class RequestResponseLoggingMiddlewareExtensions
  {
    public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder app)
    {
      return app.UseMiddleware<RequestResponseLoggingMiddleware>();
    }
  }
}
startup.cs 에서 Configure 방법 에서 미들웨어 를 사용 합 니 다.

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }
      app.UseErrorHandling();//          
      ...
      app.UseRequestResponseLogging();
      ...
      app.UseExceptionless(Configuration);
      app.UseMvc();
    }
현재 기록 의 효 과 를 한 번 볼 것 을 요청 합 니 다.제 로 그 는 exceptionless 에 존재 합 니 다.다음 그림 입 니 다.

 json 을 분석 하고 기 록 된 데 이 터 는 다음 과 같 습 니 다.

총결산
위 에서 말 한 것 은 편집장 이 소개 한.net core webapi 가 미들웨어 를 통 해 요청 과 응답 내용 을 얻 는 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기