- PR -

.NET 2.0のSoapExtentionで圧縮通信

1
投稿者投稿内容
すぬぅぴぃ
会議室デビュー日: 2006/11/04
投稿数: 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

スキルアップ/キャリアアップ(JOB@IT)