Использование Request.Body в пользовательском 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);
}
}
Всегда возвращается 0
, Но при удалении параметра string data
, он возвращает фактическую длину размещенного тела.
1 ответ
Решение
Проблема в том, что вы пытаетесь прочитать тело запроса несколько раз.
Чтобы обойти и получить дополнительную информацию, вам нужно взглянуть на этот вопрос: дважды прочитайте тело запроса