.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); }