Прочитайте запрос Json в промежуточном программном обеспечении ASP.Net Core 2 и перечитайте в контроллере - PullRequest
0 голосов
/ 31 мая 2018

У меня есть промежуточное ПО, которое регистрирует информацию о запросах в моем проекте основного 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 регистрирует данные запроса, он вообще не возвращает никаких данных.

Можете ли вы мне помочь?с этой проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...