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包供其他人使用。