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