C# Asp Net核心Web Api发布请求。正文长度始终为0

C# Asp Net核心Web Api发布请求。正文长度始终为0,c#,.net-core,asp.net-core-webapi,C#,.net Core,Asp.net Core Webapi,我正在开发一个服务,该服务将使用HTTP内容类型:application/octet stream和传输编码:chunked接收文件 我能够让服务器获取请求和请求 但是当我从Request.Body获取数据时,长度总是0 在框架中,我会使用类似 request.Content.ReadAsStreamAsync(); 但这似乎不是核心的选择 我应该如何从客户(邮递员)那里获取流的内容 使用Postman,我尝试了body的二进制和表单数据选项,但都没有在body到达服务器后得到body。在阅读一

我正在开发一个服务,该服务将使用HTTP内容类型:application/octet stream和传输编码:chunked接收文件

我能够让服务器获取请求和请求

但是当我从Request.Body获取数据时,长度总是0

在框架中,我会使用类似 request.Content.ReadAsStreamAsync(); 但这似乎不是核心的选择

我应该如何从客户(邮递员)那里获取流的内容

使用Postman,我尝试了body的二进制和表单数据选项,但都没有在body到达服务器后得到body。在阅读一些文档时,有人建议创建一个使用MultipartReader的新格式化程序。但这一切看起来都是基于具有multipart/form数据内容类型,我没有使用它。我还尝试使用curl发送请求,但结果是一样的

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}
控制器

[HttpPost]
[RequestSizeLimit(2147483648)] // https://stackoverflow.com/questions/43305220/form-key-or-value-length-limit-2048-exceeded
[DisableFormValueModelBinding] // https://dotnetcoretutorials.com/2017/03/12/uploading-files-asp-net-core/
public void Upload()
{
    Request.EnableRewind();
    Stream body = Request.Body;
    Debug.WriteLine(body.Length);
}
我从那里读到了
[DisableFormValueModelBinding]
。该属性的全部作用是阻止ASP.NET读取正文。这就是为什么
body.Length
为0的原因。它只是还没有读过(在你读完整本书之前,你不可能知道它的长度)

但您可以读取请求的
内容长度
标题:

var length = Request.ContentLength;

你在《邮递员》中指定了“尸体”吗?@GabrielLuci我指定了。我尝试了二进制和表单数据选项,但都没有得到一个主体。在阅读一些文档时,有人建议创建一个使用MultipartReader的新格式化程序。但是这一切看起来都是基于多部分/表单数据内容类型,我没有使用它。@GabrielLuci除非我读不到文档,否则StreamFile是他们创建的用于处理多部分数据的辅助方法。除非我误解了MultipartReader支持的内容,否则这对我的情况不起作用。这是有道理的。但我想我明白为什么是0了。看我的答案,我不同意。该属性阻止其他格式化程序读取正文。理想的情况是,如果尸体被单独留下,它应该可以进入。也许如果我制作一个自定义格式化程序,我就可以访问它了?我并不是说它会阻止你阅读它。我是说你还没读过。流的全部意义在于,您可以在输入内容时对其进行处理,而无需将整个内容加载到内存中。因此,根据它的定义,直到你把它读到最后,你才知道有多少数据,而你还没有读到最后,或者除非有其他东西告诉你:
Content-Length
标题就是为了这个。客户机在标题中告诉您,“这是我发送的数据量”。因此,即使长度和位置为0,我也应该能够读取正文?我可以试一试。虽然长度应该返回流中的字节数。根据初始测试,您是正确的。尽管长度为0,我还是能够从流中读取一个字节。当我得到传递的文件并返回其原始形式时,我将进行更新。因此,如果流中有数据,为什么没有长度?我的想法是,在收到整个文件之前,长度将一直在增长。流将管理内存中不存在的数据的去向。例如,FileStreams length是文件的长度。
var length = Request.ContentLength;