- - PR -
.NET 2.0のSoapExtentionで圧縮通信
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-11-04 12:13
.NET1.1&SharpZipLibでSoapExtentionでWebサービスのメッセージを圧縮送受信しておりました。
.NET2.0では標準でGzipのAPIが提供されていたのでそちらに 置き換えを行おうと思っておりますが、エラーでうまくいきません。 どうもDeCompressSoapMessageメソッドでdeCompStream.Readをやっても何も読み込めていないらしく「400: Bad Request」になっちゃいます。 下記が検証してみたソースなのですが、どこかまずいところなどありましたらアドバイスお願いします! using System; using System.IO; using System.IO.Compression; using System.Text; using System.Web.Services; using System.Web.Services.Protocols; namespace TestSoapExtention { [AttributeUsage(AttributeTargets.Method)] public class TestSoapExtentionAttribute : SoapExtensionAttribute { private int priority = 0; public override Type ExtensionType { get { return typeof(TestSoapExtentionAttribute); } } public override int Priority { get { return this.priority; } set { this.priority = value; } } } public class TestSoapExtention : SoapExtension { Stream oldStream; Stream newStream; GZipStream compStream; GZipStream deCompStream; public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } public override object GetInitializer(Type serviceType) { return null; } public override void Initialize(object initializer) { } public override Stream ChainStream(Stream stream) { this.oldStream = stream; this.newStream = new MemoryStream(); return this.newStream; } public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: break; case SoapMessageStage.AfterSerialize: CompressSoapMessage(message); break; case SoapMessageStage.BeforeDeserialize: DeCompressSoapMessage(message); break; case SoapMessageStage.AfterDeserialize: break; default: throw new Exception("invalid stage"); } } public void CompressSoapMessage(SoapMessage message) { if (compStream == null) { compStream = new GZipStream(this.oldStream, CompressionMode.Compress); } this.newStream.Position = 0; byte[] writeData = new byte[this.newStream.Length]; this.newStream.Read(writeData, 0, (int)this.newStream.Length); this.compStream.Write(writeData, 0, (int)this.newStream.Length); this.compStream.Flush(); } public void DeCompressSoapMessage(SoapMessage message) { if (deCompStream == null) { deCompStream = new GZipStream(this.oldStream, CompressionMode.Decompress); } int size = 2048; byte[] writeData = new byte[2048]; while (true) { size = this.deCompStream.Read(writeData, 0, size); if (size > 0) { this.newStream.Write(writeData, 0, size); } else { break; } this.newStream.Position = 0; } } } } |
1