【问题标题】:C# SslStream with GZipStreamC# SslStream 与 GZipStream
【发布时间】:2010-09-17 12:55:33
【问题描述】:

是否可以在 C# 中使用 GZipStream 传递 SslStream?即你能做吗


GZipStream stream = new GZipStream(sslStream, CompressionMode.Compress);
stream.Write(...);

...

GZipStream stream = new GZipStream(sslStream, CompressionMode.Decompress);
stream.Read(...);

如果可能的话,SslStream 在此之后是否仍处于可用状态,还是应该关闭?

谢谢。

【问题讨论】:

    标签: c# ssl gzip gzipstream sslstream


    【解决方案1】:

    我想不出为什么不; SSL 流只会被赋予字节,但这就是它所期望的。重要的是正确关闭GZipStream,因为即使Flush() 也并不总是真正刷新(由于必须保持运行缓冲区进行压缩)。所以:

    using(GZipStream stream = new GZipStream(sslStream, CompressionMode.Compress)) {
        stream.Write(...);
        stream.Close(); // arguably overkill; the Dispose() from "using" should be enough
    }
    

    我还假设您不是在读取和写入同一个 SSL 流(即,这是两个 单独的示例,而不是一个示例),因为听起来不太可能。

    【讨论】:

    • 是的,抱歉,该示例旨在作为客户端/服务器端。如果我处置 GZipStream 它不会关闭我的底层流吗?当它被包装在 using 语句中时,我似乎得到了 ObjectDisposed 异常......
    • @qmunke 是可选的;看到 ctor 到 gzipstream。它需要一个 bool iirc。
    【解决方案2】:

    这是可能的,有时可能会奏效,但有时也可能会失败。它应该可以工作如果你的协议总是允许你在 SSLStream 关​​闭之前“干净地关闭”GZipStream。 “完全关闭”是指 GZipStream 关​​闭效果(压缩缓冲区的刷新)可以发生并传播到对等方。它可能会失败,因为 Ssl 允许相当激烈的闭包语义。请参阅RFC 2246 的第 7.2.1 节。

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多