c# - 在自定义 ModelBinder 中使用 Request.Body

标签 c# asp.net-core asp.net-core-2.0 asp.net-core-mvc-2.0

考虑下面的自定义模型 Binder :

[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/

相关文章:

c# - IIS应用程序池回收+ quartz 调度

asp.net-core - asp.net 核心中间件中的静态属性在请求之间共享?

razor - 在 dotnet core 2 中生成 Razor HTML 电子邮件

asp.net - 如何在Vs code中使用命令行设置asp.net core启动项目

c# - 让当前线程休眠

C# 去除 XML 中的 HTML 标记

C# 如何使重复输入重叠?

MediatR 处理程序中的 ASP.NET 基础结构

c# - 将对象转换为 Task<T> 并从类型为 Type 的变量设置 T

asp.net - 自定义 ASP.NET Core 身份表