Получить RawBody из HttpContext из ActionExecutionContext в ASP. NET Core - PullRequest
0 голосов
/ 22 января 2020

У меня есть базовый класс, в который я хочу включить код, который выполняется во все мои методы контроллера. В моем особом случае я решил создать базовый класс, перезаписать OnActionExecution и заставить мои классы контроллера наследоваться от этого базового класса. Это работает довольно хорошо:

public class BaseController : Controller
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        string parsedParameters = string.Empty;
        if (context.ActionArguments.Count > 0)
        {
            inputParameters = JsonConvert.SerializeObject(context.ActionArguments.First().Value,
                                    Formatting.None,
                                    new JsonSerializerSettings
                                    {
                                        NullValueHandling = NullValueHandling.Ignore,
                                    });
        }

        // ...

        base.OnActionExecuting(context);
    }
}

Этот код берет модели отображенного представления из метода контроллера и преобразует его в JSON (для целей регистрации)

Пример методов контроллера:

public async Task<IActionResult> Create([FromBody]CreateGroupRequest requestModel)

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что дополнительные json значения, которые были переданы в конечную точку, не включаются, поскольку они не будут отображаться (поскольку такие целевые свойства не существуют в модели представления)

Я хочу получить доступ к необработанному телу объекта Request. Исходя из того, что я прочитал, трудно получить доступ к потоку тела запроса, если он уже был прочитан один раз. Я нашел несколько решений о том, как читать поток тела запроса, но они, кажется, работают только для. NET Framework, а не. NET Core.

Вопрос : Как я могу получить полное тело запроса (включая исходное JSON, отправленное на контроллер) из ActionExecutinContext в ASP. NET Core?

1 Ответ

1 голос
/ 28 января 2020

Вы можете использовать EnableBuffering () в. net core 3.x, чтобы включить тело запроса для нескольких чтений:

var bodyStr = "";
var req = context.HttpContext.Request;
req.EnableBuffering();
req.Body.Position = 0;
using (var stream = new StreamReader(req.Body))
{
    bodyStr = stream.ReadToEnd();
}
...