Step 0. 下载 ICSharpCode.SharpZipLib.dll
Step 1. 扩展 System.Web.Services.Protocols.SoapExtension,代码如下:

Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Core;
namespace SoapCompressionExtension
{
public class CompressionSoapExtensionCore : SoapExtension
{
Stream oldStream;
Stream newStream;
//必须重载的方法
public override Stream ChainStream(Stream stream)
{
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
//必须重载的方法
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}
//必须重载的方法
public override object GetInitializer(Type WebServiceType)
{
return null;
}
//必须重载的方法
public override void Initialize(object initializer){}
//必须重载的方法
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
//压缩
Compress(message);
break;
case SoapMessageStage.BeforeDeserialize:
//解压缩
Decompress(message);
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
private void Compress(SoapMessage message)
{
using (GZipOutputStream gzip = new GZipOutputStream(oldStream))
{
message.Stream.Position = 0;
StreamUtils.Copy(message.Stream, gzip, new byte[4096]);
}
}
private void Decompress(SoapMessage message)
{
using (Stream s = new GZipInputStream(oldStream))
{
StreamUtils.Copy(s, message.Stream, new byte[4096]);
}
message.Stream.Position = 0;
}
}
}
Step 2. 配置Web Service,拷贝以下配置代码到<system.web></system.web>
<webServices>
<soapExtensionTypes>
<add type="SoapCompressionExtension.CompressionSoapExtensionCore,SoapCompressionExtension" priority="3" group="0"/>
</soapExtensionTypes>
</webServices>
Step 3. 配置客户端
1) WinForm 程序配置方法: 拷贝以下代码到app.config的<configuration></configuration>节点内。
<system.web>
<webServices>
<soapExtensionTypes>
<add type="SoapCompressionExtension.CompressionSoapExtensionCore,SoapCompressionExtension" priority="3" group="0"/>
</soapExtensionTypes>
</webServices>
</system.web>
2) Asp.net 程序配置方法: 拷贝以下配置代码到web.config的<system.web></system.web>节点内。
<webServices>
<soapExtensionTypes>
<add type="SoapCompressionExtension.CompressionSoapExtensionCore,SoapCompressionExtension" priority="0" group="0"/>
</soapExtensionTypes>
</webServices>