.net core webapi 는 미들웨어 를 통 해 요청 과 응답 내용 을 가 져 오 는 방법
.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 가 미들웨어 를 통 해 요청 과 응답 내용 을 얻 는 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.