C# 如何在使用数据流(.Net stream)时计算其长度

C# 如何在使用数据流(.Net stream)时计算其长度,c#,.net,.net-core,streaming,C#,.net,.net Core,Streaming,基本上,问题是:有没有一种简单的方法来获取所消费的流的长度 在.Net服务中,我们通过.Net REST API接收流。我们将其保存到文件或数据库中。由于我们可能会以这种方式接收大量的大消息(流),我们当然会使用流,因此我们在任何时候都不会在内存中存储完整的内容(至少不是有意的) 我们想在使用流时计算它的全长,但不知道是否有一种简单的方法可以做到这一点。显然,我们不能使用该属性,因为底层的流不支持查找 实现这一点的一种方法是实现一个包装器流,该包装器跟踪消耗的字节数,但这有点麻烦。但也许这样的解

基本上,问题是:有没有一种简单的方法来获取所消费的
流的长度

在.Net服务中,我们通过.Net REST API接收
。我们将其保存到文件或数据库中。由于我们可能会以这种方式接收大量的大消息(流),我们当然会使用流,因此我们在任何时候都不会在内存中存储完整的内容(至少不是有意的)

我们想在使用
流时计算它的全长,但不知道是否有一种简单的方法可以做到这一点。显然,我们不能使用该属性,因为底层的
不支持查找


实现这一点的一种方法是实现一个包装器
,该包装器跟踪消耗的字节数,但这有点麻烦。但也许这样的解决方案已经存在(我不擅长搜索)。

如果
流本身不支持长度,那么剩下四个选项:

  • 单独传达长度,例如http中的
    内容长度
    标题
  • 将有效负载中的长度(流内容)作为前缀传递(更改数据形状)
  • 缓冲它(不建议用于大数据)并查看已知的长度
  • 使用时手动跟踪长度
    • 您可以通过使用另一个计算所消耗字节数的流(显示为
      位置
      )来装饰(包装)
      ,并将所有其他API代理到底层

你也控制发送API吗?@Fildor不太了解,我的意思是我知道所有的客户端创建者,所以我可以很好地问他们,但这不是我想要的。我希望避免更改服务-或者通过要求
内容长度
标记,我也希望避免将其作为有效负载的一部分。正如我的问题中已经暗示的那样,我不想缓冲它。这就留下了我自己已经提出的建议:-)(尽管我可能会以不同的方式实施)。@Ykok这样就留下了选项4:)是的,如果我无法避免,我可能会这样做,然后制作一个NuGet包供其他人使用。