1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
public class CompressionExtension : System.Web.Services.Protocols.SoapExtension
{
Stream oldStream;
Stream newStream;
public override Stream ChainStream(Stream stream)
{
//return base.ChainStream(stream);
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
public override object GetInitializer(Type serviceType)
{
return typeof(CompressionExtension);
}
public override object GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo methodInfo, System.Web.Services.Protocols.SoapExtensionAttribute attribute)
{
return attribute;
}
public override void Initialize(object initializer)
{
return;
}
public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
{
switch (message.Stage)
{
case System.Web.Services.Protocols.SoapMessageStage.AfterDeserialize:
break;
case System.Web.Services.Protocols.SoapMessageStage.AfterSerialize:
Zip();
break;
case System.Web.Services.Protocols.SoapMessageStage.BeforeDeserialize:
break;
case System.Web.Services.Protocols.SoapMessageStage.BeforeSerialize:
message.ContentEncoding = "gzip";
break;
default:
throw new Exception("invalid stage");
break;
}
}
private void Zip()
{
newStream.Position = 0;
newStream = new GZipStream(newStream, CompressionMode.Compress).BaseStream;
newStream.Position = 0;
Copy(newStream, oldStream);
}
void Copy(Stream from, Stream to)
{
TextReader reader = new StreamReader(from);
TextWriter writer = new StreamWriter(to);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}
} |
Partager