Использование 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 ответ

Решение

Проблема в том, что вы пытаетесь прочитать тело запроса несколько раз.

Чтобы обойти и получить дополнительную информацию, вам нужно взглянуть на этот вопрос: дважды прочитайте тело запроса

Другие вопросы по тегам