У меня есть промежуточное ПО, которое регистрирует информацию о запросах в моем проекте основного API ASP.Net, но проблема в том, что когда я читаю запрос в промежуточном программном обеспечении, я не могу прочитать тот же запрос в моем контроллере.
Кому я могу прочитать запрос Json в моем Middleware и в моем контроллере?
Middleware Comtroller
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using srpago_oxxo.Library.Logger;
using srpago_oxxo.Library.Logger.Handlers;
using srpago_oxxo.Library.Logger.Formatters;
using Microsoft.AspNetCore.Http.Internal;
namespace srpago_oxxo.Middlewares
{
public class IOMiddleware
{
private readonly RequestDelegate _next;
private Logger logger;
public IOMiddleware(RequestDelegate next)
{
_next = next;
logger = new Logger("SRPAGO-OXXO");
var formatter = new WebFormatter();
var handler = new StdoutHandler();
handler.SetFormatter(formatter);
logger.AddHandler(handler);
}
public async Task Invoke(HttpContext context)
{
var contentLenth = context.Request.ContentLength.ToString();
contentLenth = contentLenth == "" ? "-" : contentLenth;
var info = new Dictionary<string, string>()
{
{"{code}", "200"},
{"{clientIp}", context.User.ToString()},
{"{method}", context.Request.Method},
{"{path}", context.Request.Path.Value},
{"{bodyLength}", contentLenth},
{"{message}", await GetJsonRequest(context)},
};
logger.Info(info);
await _next.Invoke(context);
}
private async Task<string> GetJsonRequest(HttpContext context)
{
var body = context.Request.Body;
context.Request.EnableRewind();
var request = context.Request;
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
var bodyAsText = Encoding.UTF8.GetString(buffer);
request.Body = body;
if (bodyAsText == "")
{
bodyAsText = "{}";
}
return bodyAsText;
}
}
}
Это мой базовый контроллер
using System.IO;
using Microsoft.AspNetCore.Mvc;
namespace srpago_oxxo.Controllers
{
public class BaseController : Controller
{
protected string GetJsonRequest()
{
var request = this.HttpContext.Request;
var stream = new StreamReader(request.Body);
var body = stream.ReadToEnd()
.Replace("\n", "")
.Replace("\t", "");
return body;
}
}
}
Когда я использую функцию GetJsonRequest после того, как IOMiddleware регистрирует данные запроса, он вообще не возвращает никаких данных.
Можете ли вы мне помочь?с этой проблемой?