在自定义 ModelBinder 中使用 Request.Body
Using Request.Body in custom ModelBinder
考虑下面的自定义模型活页夹:
[ModelBinder(typeof(CustomModelBinder))]
public class StreamModel
{
public MemoryStream Stream
{
get;
set;
}
}
public class CustomModelBinder : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
var request = bindingContext.HttpContext.Request;
var ms = new MemoryStream();
request.Body.CopyTo(ms);
bindingContext.Result = ModelBindingResult.Success(new StreamModel
{
Stream = ms
});
}
}
ms.Length
的值始终等于 0
。
有什么方法可以在 ModelBinder 中读取请求主体吗?
下面的场景对我来说也很奇怪:
public class TestController : Controller
{
[HttpPost]
public IActionResult Test(string data)
{
var ms = new MemoryStream();
request.Body.CopyTo(ms);
return OK(ms.Length);
}
}
总是returns0
。
但是当删除参数 string data
时,它 returns 发布正文的实际长度。
问题是您试图多次读取请求正文。
有关解决方法和更多信息,您应该查看以下问题:
考虑下面的自定义模型活页夹:
[ModelBinder(typeof(CustomModelBinder))]
public class StreamModel
{
public MemoryStream Stream
{
get;
set;
}
}
public class CustomModelBinder : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
var request = bindingContext.HttpContext.Request;
var ms = new MemoryStream();
request.Body.CopyTo(ms);
bindingContext.Result = ModelBindingResult.Success(new StreamModel
{
Stream = ms
});
}
}
ms.Length
的值始终等于 0
。
有什么方法可以在 ModelBinder 中读取请求主体吗?
下面的场景对我来说也很奇怪:
public class TestController : Controller
{
[HttpPost]
public IActionResult Test(string data)
{
var ms = new MemoryStream();
request.Body.CopyTo(ms);
return OK(ms.Length);
}
}
总是returns0
。
但是当删除参数 string data
时,它 returns 发布正文的实际长度。
问题是您试图多次读取请求正文。
有关解决方法和更多信息,您应该查看以下问题: