I am working on soapextension that compresses soap message.
I am stuck at only one stage now. When I get response from webservice....o n client at -BeforeDeseriali ze stage when I try to copy original or old stream to temp stream so that I can de compress it I get 'Stream dose not support seek operation' error.
Has any one come across smilar issue ...that while altering stream you could not capture it properly when client recieves it from server
debugging
This code will create new file for input and output each stage. You can see that till that point message is getting compressed and de compressed properly. Sort file by Date created
[code=c#]
using System;
using System.Collecti ons.Generic;
using System.Text;
using System.Web;
using System.Web.Serv ices;
using System.Web.Serv ices.Protocols;
using System.IO;
using System.IO.Compr ession;
using System.Xml;
using System.Threadin g;
namespace GZIPSoapExtensi on
{
public class GZIPSoapExtensi on : SoapExtension
{
protected Stream OriginalStream = null;
protected Stream NewStream = null;
protected String Mode = null;
public override object GetInitializer( Type WebServiceType)
{
return "C:\\" + WebServiceType. FullName + ".log";
}
public override object GetInitializer( LogicalMethodIn fo methodInfo, SoapExtensionAt tribute attribute)
{
return null;
}
public override void Initialize(obje ct initializer)
{
}
public override Stream ChainStream(Str eam stream)
{
OriginalStream = stream;
NewStream = new MemoryStream();
return NewStream;
}
public override void ProcessMessage( SoapMessage message)
{
Mode = "";
switch (message.Stage)
{
case SoapMessageStag e.BeforeSeriali ze:
Mode = "BeforeSerializ e";
break;
case SoapMessageStag e.AfterSerializ e:
Mode = "AfterSerialize ";
AfterSerializeH andler(message) ;
break;
case SoapMessageStag e.BeforeDeseria lize:
Mode = "BeforeDeserial ize";
BeforeDeseriali zeHandler(messa ge);
break;
case SoapMessageStag e.AfterDeserial ize:
Mode = "AfterDeseriali ze";
break;
}
}
public void BeforeDeseriali zeHandler(SoapM essage message)
{
WriteToLog("Bef oreDeserializeH andler -- BeforeDecompres s", message, OriginalStream) ;
Stream ms = new MemoryStream ();
Copy(OriginalSt ream, ms);
ms.Position = 0;
ms = DeCompressData( ms);
ms.Position = 0;
NewStream.Posit ion = 0;
Copy(ms, NewStream);
ms.Position = 0;
NewStream.Posit ion = 0;
WriteToLog("Bef oreDeserializeH andler -- After Decompress", message, NewStream);
ms.Position = 0;
NewStream.Posit ion = 0;
}
public void AfterSerializeH andler(SoapMess age message)
{
WriteToLog("Aft erSerializeHand ler -- before Compress" ,message, NewStream);
MemoryStream ms = new MemoryStream();
NewStream.Posit ion = 0;
Copy(NewStream, ms);
NewStream.Posit ion = 0;
ms.Position = 0;
ms= CompressData(ms );
ms.Position = 0;
NewStream.Posit ion = 0;
Copy(ms, OriginalStream) ;
ms.Position = 0;
WriteToLog("Aft erSerializeHand ler -- After Compress", message, ms);
}
protected void Copy(Stream from, Stream to)
{
from.Position = 0;
int bytesRead;
byte[] buffer = new byte[2];
BinaryReader reader = new BinaryReader(fr om);
BinaryWriter writer = new BinaryWriter(to );
do
{
bytesRead = reader.Read(buf fer, 0, buffer.Length);
writer.Write(bu ffer, 0, bytesRead);
} while (bytesRead > 0);
writer.Flush();
}
public MemoryStream CompressData(Me moryStream source)
{
if (source == null) return null;
MemoryStream ms = new MemoryStream();
GZipStream compressedzipSt ream = null;
try
{
byte[] buffer = new byte[source.Length];
source.Position = 0;
source.Read(buf fer, 0, buffer.Length);
compressedzipSt ream = new GZipStream(ms, CompressionMode .Compress, true);
compressedzipSt ream.Write(buff er, 0, buffer.Length);
}
finally
{
compressedzipSt ream.Close();
}
return ms;
}
public MemoryStream DeCompressData( Stream s)
{
if (s == null) return null;
s.Position = 0;
GZipStream gs = new GZipStream(s, CompressionMode .Decompress);
BinaryReader reader = new BinaryReader(gs );
MemoryStream result = new MemoryStream();
BinaryWriter writer = new BinaryWriter(re sult);
int bytesRead;
byte[] buffer = new byte[2];
try
{
do
{
bytesRead = reader.Read(buf fer, 0, buffer.Length);
writer.Write(bu ffer, 0, bytesRead);
} while (bytesRead > 0);
writer.Flush();
result.Position = 0;
}
finally
{
}
return result;
}
public void WriteToLog(Stri ng Source ,SoapMessage message, Stream s)
{
Thread.Sleep(10 00);
int bytesRead;
String MsgType = null;
byte[] buffer = new byte[2];
if (message.GetTyp e() == typeof(SoapServ erMessage)) MsgType = "ServerMessage" ;
if (message.GetTyp e() == typeof(SoapClie ntMessage)) MsgType = "ClientMessage" ;
//It logs message in new file. Just to make it easy to debug compressed message.
FileStream fs = new FileStream("C:\ \" + MsgType + "-" + Source + "-" + DateTime.Now.Se cond.ToString() + DateTime.Now.Mi llisecond.ToStr ing() + ".txt", FileMode.Append , FileAccess.Writ e);
try
{
BinaryReader reader = new BinaryReader(s) ;
BinaryWriter writer = new BinaryWriter(fs );
do
{
bytesRead = reader.Read(buf fer, 0, buffer.Length);
writer.Write(bu ffer, 0, bytesRead);
} while (bytesRead > 0);
writer.Flush();
}
finally
{
//if (swr != null) swr.Close();
if (fs != null) fs.Close();
}
}
}
[AttributeUsage( AttributeTarget s.Method)]
public class GZIPSoapExtensi onAttribute : SoapExtensionAt tribute
{
private int _Priority = 1;
public override int Priority
{
get
{
return _Priority;
}
set
{
_Priority = value;
}
}
public override Type ExtensionType
{
get { return typeof(GZIPSoap Extension); }
}
}
}
[/code]
I am stuck at only one stage now. When I get response from webservice....o n client at -BeforeDeseriali ze stage when I try to copy original or old stream to temp stream so that I can de compress it I get 'Stream dose not support seek operation' error.
Has any one come across smilar issue ...that while altering stream you could not capture it properly when client recieves it from server
debugging
This code will create new file for input and output each stage. You can see that till that point message is getting compressed and de compressed properly. Sort file by Date created
[code=c#]
using System;
using System.Collecti ons.Generic;
using System.Text;
using System.Web;
using System.Web.Serv ices;
using System.Web.Serv ices.Protocols;
using System.IO;
using System.IO.Compr ession;
using System.Xml;
using System.Threadin g;
namespace GZIPSoapExtensi on
{
public class GZIPSoapExtensi on : SoapExtension
{
protected Stream OriginalStream = null;
protected Stream NewStream = null;
protected String Mode = null;
public override object GetInitializer( Type WebServiceType)
{
return "C:\\" + WebServiceType. FullName + ".log";
}
public override object GetInitializer( LogicalMethodIn fo methodInfo, SoapExtensionAt tribute attribute)
{
return null;
}
public override void Initialize(obje ct initializer)
{
}
public override Stream ChainStream(Str eam stream)
{
OriginalStream = stream;
NewStream = new MemoryStream();
return NewStream;
}
public override void ProcessMessage( SoapMessage message)
{
Mode = "";
switch (message.Stage)
{
case SoapMessageStag e.BeforeSeriali ze:
Mode = "BeforeSerializ e";
break;
case SoapMessageStag e.AfterSerializ e:
Mode = "AfterSerialize ";
AfterSerializeH andler(message) ;
break;
case SoapMessageStag e.BeforeDeseria lize:
Mode = "BeforeDeserial ize";
BeforeDeseriali zeHandler(messa ge);
break;
case SoapMessageStag e.AfterDeserial ize:
Mode = "AfterDeseriali ze";
break;
}
}
public void BeforeDeseriali zeHandler(SoapM essage message)
{
WriteToLog("Bef oreDeserializeH andler -- BeforeDecompres s", message, OriginalStream) ;
Stream ms = new MemoryStream ();
Copy(OriginalSt ream, ms);
ms.Position = 0;
ms = DeCompressData( ms);
ms.Position = 0;
NewStream.Posit ion = 0;
Copy(ms, NewStream);
ms.Position = 0;
NewStream.Posit ion = 0;
WriteToLog("Bef oreDeserializeH andler -- After Decompress", message, NewStream);
ms.Position = 0;
NewStream.Posit ion = 0;
}
public void AfterSerializeH andler(SoapMess age message)
{
WriteToLog("Aft erSerializeHand ler -- before Compress" ,message, NewStream);
MemoryStream ms = new MemoryStream();
NewStream.Posit ion = 0;
Copy(NewStream, ms);
NewStream.Posit ion = 0;
ms.Position = 0;
ms= CompressData(ms );
ms.Position = 0;
NewStream.Posit ion = 0;
Copy(ms, OriginalStream) ;
ms.Position = 0;
WriteToLog("Aft erSerializeHand ler -- After Compress", message, ms);
}
protected void Copy(Stream from, Stream to)
{
from.Position = 0;
int bytesRead;
byte[] buffer = new byte[2];
BinaryReader reader = new BinaryReader(fr om);
BinaryWriter writer = new BinaryWriter(to );
do
{
bytesRead = reader.Read(buf fer, 0, buffer.Length);
writer.Write(bu ffer, 0, bytesRead);
} while (bytesRead > 0);
writer.Flush();
}
public MemoryStream CompressData(Me moryStream source)
{
if (source == null) return null;
MemoryStream ms = new MemoryStream();
GZipStream compressedzipSt ream = null;
try
{
byte[] buffer = new byte[source.Length];
source.Position = 0;
source.Read(buf fer, 0, buffer.Length);
compressedzipSt ream = new GZipStream(ms, CompressionMode .Compress, true);
compressedzipSt ream.Write(buff er, 0, buffer.Length);
}
finally
{
compressedzipSt ream.Close();
}
return ms;
}
public MemoryStream DeCompressData( Stream s)
{
if (s == null) return null;
s.Position = 0;
GZipStream gs = new GZipStream(s, CompressionMode .Decompress);
BinaryReader reader = new BinaryReader(gs );
MemoryStream result = new MemoryStream();
BinaryWriter writer = new BinaryWriter(re sult);
int bytesRead;
byte[] buffer = new byte[2];
try
{
do
{
bytesRead = reader.Read(buf fer, 0, buffer.Length);
writer.Write(bu ffer, 0, bytesRead);
} while (bytesRead > 0);
writer.Flush();
result.Position = 0;
}
finally
{
}
return result;
}
public void WriteToLog(Stri ng Source ,SoapMessage message, Stream s)
{
Thread.Sleep(10 00);
int bytesRead;
String MsgType = null;
byte[] buffer = new byte[2];
if (message.GetTyp e() == typeof(SoapServ erMessage)) MsgType = "ServerMessage" ;
if (message.GetTyp e() == typeof(SoapClie ntMessage)) MsgType = "ClientMessage" ;
//It logs message in new file. Just to make it easy to debug compressed message.
FileStream fs = new FileStream("C:\ \" + MsgType + "-" + Source + "-" + DateTime.Now.Se cond.ToString() + DateTime.Now.Mi llisecond.ToStr ing() + ".txt", FileMode.Append , FileAccess.Writ e);
try
{
BinaryReader reader = new BinaryReader(s) ;
BinaryWriter writer = new BinaryWriter(fs );
do
{
bytesRead = reader.Read(buf fer, 0, buffer.Length);
writer.Write(bu ffer, 0, bytesRead);
} while (bytesRead > 0);
writer.Flush();
}
finally
{
//if (swr != null) swr.Close();
if (fs != null) fs.Close();
}
}
}
[AttributeUsage( AttributeTarget s.Method)]
public class GZIPSoapExtensi onAttribute : SoapExtensionAt tribute
{
private int _Priority = 1;
public override int Priority
{
get
{
return _Priority;
}
set
{
_Priority = value;
}
}
public override Type ExtensionType
{
get { return typeof(GZIPSoap Extension); }
}
}
}
[/code]
Comment