У меня есть приложение API Netcore 3, которое регистрирует входящий запрос и затем передает его в действие контроллера.
Мой код выглядит так:
public RequestLoggingHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RequestLoggingRequirement requirement)
{
try
{
var httpContext = _httpContextAccessor.HttpContext;
var request = httpContext.Request;
_repository = (ICleanupOrderRepository)httpContext.RequestServices.GetService(typeof(ICleanupOrderRepository));
_cache = (IMemoryCache)httpContext.RequestServices.GetService(typeof(IMemoryCache));
httpContext.Items["requestId"] = SaveRequest(request);
context.Succeed(requirement);
return Task.CompletedTask;
}
catch (Exception ex)
{
throw ex;
}
}
private int SaveRequest(HttpRequest request)
{
try
{
// Allows using several time the stream in ASP.Net Core
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
request.Body.ReadAsync(buffer, 0, buffer.Length);
var requestContent = Encoding.UTF8.GetString(buffer);
var requestId = _repository.SaveRawHandlerRequest($"{request.Scheme} {request.Host}{request.Path} {request.QueryString} {requestContent}");
return requestId;
}
catch (Exception ex)
{
throw ex;
}
}
Однако, когда этот запросКонтроллеру передается тело запроса, равное нулю.
Ранее в Core2.x вы могли сделать
request.EnableRewind();
Насколько я понимаю, теперь это заменено на
httpContext.Request.EnableBuffering();
Однако, даже с
httpContext.Request.EnableBuffering();
Тело запроса остается нулевым после прочтения тела запроса.
Как я могу обойти это?