Radek Cerny
8/7/2003 2:56:00 AM
Hi, we compress responses, not requests, but the code should be similar.
In the web.config file, you need:
<webServices>
<soapExtensionTypes>
<add type="DMSI.DMSSoapExtension,DMSI"
priority="1"
group="0" />
</soapExtensionTypes>
</webServices>
And the code:
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using ICSharpCode.SharpZipLib.GZip;
namespace DMSI
{
public class DMSSoapExtension : SoapExtension
{
Stream oldStream;
Stream newStream;
bool doCompress = true;
public override Stream ChainStream(Stream stream)
{
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
public override object GetInitializer(Type serviceType)
{
return null;
}
public override object GetInitializer(LogicalMethodInfo methodInfo,
SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(object initializer)
{
}
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
WriteOutput(message);
break;
case SoapMessageStage.BeforeDeserialize:
WriteInput(message);
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
public void WriteOutput(SoapMessage message)
{
// Don't compress client outgoing messages
if (message is SoapClientMessage || !doCompress)
{
newStream.Position = 0;
Copy(newStream, oldStream);
}
else
{
newStream.Position = 0;
Compress(newStream, oldStream);
}
}
public void WriteInput(SoapMessage message)
{
Stream tempStream = new MemoryStream();
try
{
SafeCopy(oldStream, tempStream);
tempStream.Position = 0;
}
catch (Exception x)
{
string s = x.ToString();
}
// Don't uncompress server incoming messages
if (message is SoapClientMessage && doCompress)
{
// Need to inflate
Inflate(tempStream, newStream);
newStream.Position = 0;
}
else
{
Copy(tempStream, newStream);
newStream.Position = 0;
}
}
void Copy(Stream from, Stream to)
{
byte[] writeData = new byte[from.Length];
from.Read(writeData, 0, (int)from.Length);
to.Write(writeData, 0, writeData.Length);
}
void Compress(Stream from, Stream to)
{
Stream s = new GZipOutputStream(to);
byte[] writeData = new byte[from.Length];
from.Read(writeData, 0, (int)from.Length);
s.Write(writeData, 0, writeData.Length);
s.Close();
}
void SafeCopy(Stream from, Stream to)
{
int size = 2048;
byte[] writeData = new byte[size];
while (true)
{
size = from.Read(writeData, 0, size);
if (size > 0)
to.Write(writeData, 0, size);
else
break;
}
}
void Inflate(Stream from, Stream to)
{
Stream s = new GZipInputStream(from);
int size = 2048;
byte[] writeData = new byte[2048];
while (true)
{
size = s.Read(writeData, 0, size);
if (size > 0)
to.Write(writeData, 0, size);
else
break;
}
s.Close();
}
}
}
"Arthur Zeyda" <ArthurZeyda18@hotmail.com> wrote in message
news:004901c35c40$731fc4b0$a501280a@phx.gbl...
> I need help with compressing the request for a web
> service. If someone has the developed the code to do it
> in .NET 1.1 I would really appreciate your help.
> Whenever I try to compress the RequestStream it comes
> back with a method not implememented by the object
> exception. PLEASE HELP.
>
> Thank You
> Arthur Zeyda