Чтение тела запроса внутри пользовательского InvalidModelStateResponseFactory asp.net core 2.2 - PullRequest
0 голосов
/ 30 марта 2019

Я хочу получить тело HTTP-запроса в моем пользовательском обработчике InvalidModelStateResponseFactory, и он всегда возвращается пустым.
Я пробовал так много решений на SO и других веб-сайтах, но, похоже, использование EnableRewind не действует внутри InvalidModelStateResponseFactory.
Так есть ли особые случаи, когда я могу получить тело запроса внутри InvalidModelStateResponseFactory?

Мой код в Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.Configure<ApiBehaviorOptions>(options =>
    {
        options.InvalidModelStateResponseFactory = actionContext =>
        {
            actionContext.HttpContext.Request.EnableRewind();
            using(StreamReader stream = new StreamReader(actionContext.HttpContext.Request.Body))
            {
                string body = stream.ReadToEnd();    //body is always empty
            }

            return new BadRequestObjectResult(/*Some Error Model*/);
        };
    });
}

1 Ответ

2 голосов
/ 31 марта 2019

Я могу сделать приведенный вами пример простым изменением, заменив:

actionContext.HttpContext.Request.EnableRewind();

на:

actionContext.HttpContext.Request.Body.Position = 0;

После прочтения тела(от самого MVC), позиция потока должна быть сброшена в начало, прежде чем пытаться прочитать его снова.

В моем тестировании я обнаружил, что мне не нужен вызов EnableRewind вообще , но в случае, если это необходимо в вашем случае, я ожидаю, что в вашем примере это будет называться слишком поздно .Если установка Position на 0, как я показал, не работает в одиночку, вам может понадобиться добавить пользовательское промежуточное ПО, которое настраивает перемотку:

app.Use(async (ctx, next) =>
{
    ctx.Request.EnableRewind();
    await next();
});

Это необходимо добавить до UseMvc, но, как я уже сказал, я обнаружил, что в моем тестировании это было не нужно, но я ожидаю, что это не всегда так.

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