[阅读: 439] 2006-11-12 10:34:27
我想用SoapExtension对Web Service的调用进行压缩.
这个类里面的几个关键方法如下. 现在在解压缩的时候,得到的流不是我压缩过的,而是一个SOAP的错误, 我对SoapExtension里面的这2个流的转换有点晕, 不知道在下面几种状态下, oldStream和newStream分别指的是哪个.
//生成新的流的引用
public override Stream ChainStream( Stream stream )
{
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
CompressMessage(message);
break;
case SoapMessageStage.BeforeDeserialize:
UnCompressMessage(message);
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
public void CompressMessage(SoapMessage message)
{
newStream.Position = 0;
byte[] oldBytes = newStream.GetBuffer();
if (traceLog)
{
WriteLog(zipLogFilenamePre, oldBytes);
}
byte[] newBytes = Compression.GZipByteData(oldBytes);
if (traceLog)
{
WriteLog(zipLogFilenameAfter, newBytes);
}
CopyStream(newStream,oldStream);
newStream.Position = 0;
}
public void UnCompressMessage(SoapMessage message)
{
MemoryStream zipedStream = new MemoryStream();
CopyStream(oldStream, zipedStream);
//oldStream.Position = 0;
//byte[] oldBytes = ((MemoryStream) oldStream).GetBuffer();
byte[] oldBytes = zipedStream.GetBuffer();
if (traceLog)
{
WriteLog(unzipLogFilenamePre, oldBytes);
WriteLog(unzipLogFilenamePre, newStream.GetBuffer());
}
byte[] newBytes = Compression.UnGZipByteData(oldBytes);
if (traceLog)
{
WriteLog(unzipLogFilenameAfter, newBytes);
}
MemoryStream unzipedStream = new MemoryStream(newBytes);
CopyStream(unzipedStream,newStream);
newStream.Position = 0;
oldStream.Position = 0;
}
private void CopyStream(Stream fromStream, Stream toStream)
{
StreamReader reader = new StreamReader(fromStream);
StreamWriter writer = new StreamWriter(toStream);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}