[C# 2.0]Compression des flux SOAP
Salut à tous,
Voici mon PB. J'appel un WebService Java depuis mon code C#. Seulement, les données que je passe en entrée des méthodes de ce WebService sont assez importantes. Je souhaiterais donc compresser la demande et réduire ainsi la quantité de donnée qui transite sur le réseau.
J'ai donc mis en place une SoapExtension et j'utilise le namespace System.IO.Compression pour la compression gzip.
Mais mon PB est que ça ne marche pas, ma request ne semble pas compressée.
Voici mon code :
Code:
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();
}
} |