考虑下面的自定义模型联编程序:

[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时,它将返回发布主体的实际长度。

最佳答案

问题是您尝试多次读取请求正文。

有关替代方法和更多信息,您应该看一下以下问题:
Read request body twice

关于c# - 在自定义ModelBinder中使用Request.Body,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48297331/

10-17 02:26