背景
我想在应用程序的未来 .Net Core 端口中使用StreamJsonRpc作为 WCF 的替代品。在将代码移植到 .Net Core 之前,我想更新现有代码(即 .Net Framework 4.8)以使用 StreamJsonRpc。
因为StreamJsonRpc写入的数据比二进制源数据大,而且压缩性极强,所以想用DeflateStream
它来压缩。
这导致了问题:压缩适用于 .Net Core,但不适用于 .Net Framework。
为什么它不起作用
考虑以下代码:
var output = new MemoryStream();
var deflater = new DeflateStream(output, CompressionMode.Compress, leaveOpen:true);
var data = Encoding.UTF8.GetBytes("This is the data to be compressed");
deflater.Write(data, 0, data.Length);
deflater.Flush();
Console.WriteLine(output.Length); // 0 for .Net 4.8, >0 for .Net Core 3.1+
对于 .Net Core,这会输出一个大于零的数字。对于 .Net Framework,此输出为零。
我已经进行了检测StreamJsonRpc
,我可以看到它Stream.Flush()
在写入数据块后正在调用,所以我很确定这是问题所在。
.Net Core 实现DeflateStream.Flush()
实际上会刷新,但 .Net Framework 实现什么也不做。
我的问题
.Net Framework 4.8 中有什么方法可以刷新DeflateStream
吗?如果有,我可以DeflateStream
为该实现编写一个包装类,Stream.Flush()
以便它实际刷新。
其他注意事项
2015 年 10 月为此提出了一个错误,并于 2015年 12 月为 .Net Core 修复了该错误。
此外,文档DeflateStream.Flush()
不正确。
对于 .Net Framework和.Net Core,标头说:
此方法的当前实现没有功能。
但在备注下它说:
如果压缩模式设置为 Compress,则刷新内部缓冲区。
显然,这两件事都不正确,.Net Core 与 .Net Framework 的文档应该不同。