中国开发网: 论坛: 程序员情感CBD: 贴子 435772
dead_lee: 谁做过SOAPExtension
我想用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();
}

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录