[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

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