InvalidModelStateResponseFactory

InvalidModelStateResponseFactory

我想在我的自定义InvalidModelStateResponseFactory处理程序中获取HTTP请求正文,并且始终返回空。
我在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*/);
        };
    });
}

最佳答案

通过替换以下内容,我可以对您提供的示例进行简单的更改:

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之前添加,但是正如我已经说过的,我在测试中发现它不是必需的,但我希望情况并非总是如此。

08-28 07:25