2010-09-17 3 views
0

Можно ли использовать GZipStream, передавая SslStream в C#? то есть вы можете сделатьC# SslStream с GZipStream


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

... 

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

Если это возможно, является 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 (т.е. есть два отдельных примеров, не один пример), так как это не звучит вероятно, будет работать.

+0

Да, извините, что пример был предназначен для сторон клиента/сервера. Если я использую GZipStream, он не закрывает мой базовый поток? Я, казалось, получал исключения ObjectDisposed, когда он был завернут в оператор using ... –

+0

@qmunke, который является необязательным; см. ctor для gzipstream. Требуется bool iirc. –

0

Возможно и может иногда работать, но иногда это может случиться. Он должен работать , если ваш протокол всегда позволяет вам «тщательно закрыть» GZipStream до закрытия SSLStream. Под «чисто близким» я подразумеваю, что эффекты закрытия GZipStream (промывка буфера сжатия) могут возникать и распространяться на одноранговое соединение. Он может потерпеть неудачу, потому что Ssl допускает довольно резкую семантику закрытия. См. Раздел 7.2.1 от RFC 2246.

Смежные вопросы