SharpDevelop Community

Get your problems solved!
Welcome to SharpDevelop Community Sign in | Join | Help
in Search

compression of message in web service

Last post 08-21-2008 9:44 PM by JohnReilly. 1 replies.
Page 1 of 1 (2 items)
Sort Posts: Previous Next
  • 08-12-2008 1:09 AM

    compression of message in web service

    Hello

     

    using System;

    using System.IO;

    using System.Text ;

    using System.Web.Services;

    using System.Web.Services.Protocols ;

    using ICSharpCode.SharpZipLib.Checksums;

    using ICSharpCode.SharpZipLib.Zip;

    using ICSharpCode.SharpZipLib.GZip;

    using System.Xml ;

     

    namespace Radcom

    {

          /// <summary>

          /// Summary description for ConpressionExtension.

          /// </summary>

          public class CompressionExtension : System.Web.Services.Protocols.SoapExtension

          {

                Stream oldStream;

                Stream newStream;

       

     

                public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)

                {

                      return attribute;

                }

     

                // Get the Type

                public override object GetInitializer(Type t)

                {

                      return typeof(CompressionExtension);

                }

       

                // Get the CompressionExtensionAttribute

                public override void Initialize(object initializer)

                {

                      CompressionExtensionAttribute attribute = (CompressionExtensionAttribute) initializer;

     

                      return;

                }

     

                // Process the SOAP Message

                public override void ProcessMessage(SoapMessage message)

                {

                      // Check for the various SOAP Message Stages

                      switch (message.Stage)

                      {

     

                            case SoapMessageStage.BeforeSerialize:

                                  break;

     

                            case SoapMessageStage.AfterSerialize:

                                  // ZIP the contents of the SOAP Body after it has

                                  // been serialized

                                  Zip();

                                  break;

     

                            case SoapMessageStage.BeforeDeserialize:

                                  // Unzip the contents of the SOAP Body before it is

                                  // deserialized

                                  Unzip();

                                  break;

     

                            case SoapMessageStage.AfterDeserialize:

                                  break;

     

                            default:

                                  throw new Exception("invalid stage");

                      }

                }

     

                // Gives us the ability to get hold of the RAW SOAP message

                public override Stream ChainStream( Stream stream )

                {

                      oldStream = stream;

                      newStream = new MemoryStream();

                      return newStream;

                }

     

                // Utility method to copy streams

                void Copy(Stream from, Stream to)

                {

                      TextReader reader = new StreamReader(from);

                      TextWriter writer = new StreamWriter(to);

                      writer.WriteLine(reader.ReadToEnd());

                      writer.Flush();

                }

     

       

                // Zip the SOAP Body

                private void Zip()

                {

                      newStream.Position = 0;

                      // Zip the SOAP Body

                      newStream = ZipSoap(newStream);

                      // Copy the streams

                      Copy(newStream, oldStream);

                }

     

                // The actual ZIP method

                private byte[ Zip(string stringToZip)

                {

                      byte[ inputByteArray = Encoding.UTF8.GetBytes(stringToZip);

                      MemoryStream ms = new MemoryStream();

     

                      // Check the #ziplib docs for more information

                      ZipOutputStream zipOut = new ZipOutputStream( ms ) ;

                      ZipEntry ZipEntry = new ZipEntry("ZippedFile");

                      zipOut.PutNextEntry(ZipEntry);

                      zipOut.SetLevel(9);

                      zipOut.Write(inputByteArray, 0 , inputByteArray.Length ) ;    

                      zipOut.Finish();

                      zipOut.Close();

     

                      // Return the zipped contents

                      return ms.ToArray();

                }

     

                // Select and Zip the appropriate parts of the SOAP message

                public MemoryStream ZipSoap(Stream streamToZip)

                {

                      streamToZip.Position = 0;

                      // Load a XML Reader

                      XmlTextReader reader = new XmlTextReader(streamToZip);

                      XmlDocument dom = new XmlDocument();

                      dom.Load(reader);

                      // Load a NamespaceManager to enable XPath selection

                      XmlNamespaceManager nsmgr = new XmlNamespaceManager(dom.NameTable);

                      nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");

                      XmlNode node = dom.SelectSingleNode("//soap:Body", nsmgr);

                      // Select the contents within the method defined in the SOAP body

                      node = node.FirstChild.FirstChild;

                      // Check if there are any nodes selected

                      while( node != null )

                      {

                            if( node.InnerXml.Length > 0 )

                            {

                                  // Zip the data

                                  byte[ outData = Zip(node.InnerXml);

                                  // Convert it to Base64 for transfer over the internet

                                  node.InnerXml = Convert.ToBase64String(outData) ;

                            }

                            // Move to the next parameter

                            node = node.NextSibling ;

                      }

                      MemoryStream ms = new MemoryStream();

                      // Save the updated data

                      dom.Save(ms);

                      ms.Position = 0;

         

                      return ms;

                }

     

                // Unzip the SOAP Body

                private void Unzip()

                {

                      MemoryStream unzipedStream = new MemoryStream();

               

                      TextReader reader = new StreamReader(oldStream);

                      TextWriter writer = new StreamWriter(unzipedStream);

                      writer.WriteLine(reader.ReadToEnd());

                      writer.Flush();

                      // Unzip the SOAP Body

                      unzipedStream = UnzipSoap(unzipedStream);

                      // Copy the streams

                      Copy(unzipedStream, newStream);

        

                      newStream.Position = 0;

                }

     

                // Actual Unzip logic

                private byte[ Unzip(string stringToUnzip)

                {

                      // Decode the Base64 encoding

                      byte[ inputByteArray = Convert.FromBase64String( stringToUnzip ) ;

                      MemoryStream ms = new MemoryStream(inputByteArray) ;

                      MemoryStream ret = new MemoryStream();

     

                      // Refer to #ziplib documentation for more info on this

                      ZipInputStream zipIn = new ZipInputStream(ms);

                      ZipEntry theEntry = zipIn.GetNextEntry();

                      Byte[ buffer = new Byte[2048] ;

                      int size = 2048;

                      while (true)

                      {

                            size = zipIn.Read(buffer, 0, buffer.Length);

                            if (size > 0)

                            {

                                  ret.Write(buffer, 0, size);

                            }

                            else

                            {

                                  break;

                            }

                      }

                      return ret.ToArray();

                }

     

                // Unzip the SOAP Body

                public MemoryStream UnzipSoap(Stream streamToUnzip)

                {

                      streamToUnzip.Position = 0;

                      // Load a XmlReader

                      XmlTextReader reader = new XmlTextReader(streamToUnzip);

                      XmlDocument dom = new XmlDocument();

                      dom.Load(reader);

     

                      XmlNamespaceManager nsmgr = new XmlNamespaceManager(dom.NameTable);

                      nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");

                      // Select the SOAP Body node

                      XmlNode node = dom.SelectSingleNode("//soap:Body", nsmgr);

                      node = node.FirstChild.FirstChild;

     

                      // Check if node exists

                      while( node != null )

                      {

                            if( node.InnerXml.Length >0 )

                            {

                                  // Send the node's contents to be unziped

                                  byte[ outData = Unzip(node.InnerXml);

                                  string sTmp = Encoding.UTF8.GetString(outData);

                                  node.InnerXml = sTmp;

                            }

                            // Move to the next parameter

                            node = node.NextSibling ;

                      }

     

                      MemoryStream ms = new MemoryStream();

         

                      dom.Save(ms);

                      ms.Position = 0;

     

                      return ms;

                }

     

          }

    }

     

    using System;

    using System.Web.Services;

    using System.Web.Services.Protocols;

     

    namespace Radcom

    {

          /// <summary>

          /// Summary description for CompressionExtensionAttribute.

          /// </summary>

         

          // Make the Attribute only Applicable to Methods

          [AttributeUsage(AttributeTargets.Method)]

          public class CompressionExtensionAttribute : System.Web.Services.Protocols.SoapExtensionAttribute

          {

       

                private int priority;

     

                // Override the base class properties

                public override Type ExtensionType

                {

                      get { return typeof(CompressionExtension); }

                }

     

                public override int Priority

                {

                      get

                      {

                            return priority;

                      }

                      set

                      {

                            priority = value;

                      }

                }

     

          }

    }

     

     


    using System.Web.Services;

    using MasterCSharp.WebServices ;  Error  WHY?**********************

    using System.Data ;

    using System.Data.SqlClient ;

     

    public class MyService

    {

     

          [WebMethod]

          [CompressionExtension]

          public string MyMethod()
          {


                // Replace with the connection string to connect to your database

                DataSet ds = new DataSet();

                /*

                Fill Dataset

                */

                return ds.GetXml() ;

          }

     

    }

     


    //#############
    //Client
    //#############
    using System.Diagnostics;
    using System.Xml.Serialization;
    using System;
    using System.Web.Services.Protocols;
    using System.ComponentModel;
    using System.Web.Services;
    using ICSharpCode.SharpZipLib.BZip2;
    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Core;
    using ICSharpCode.SharpZipLib.Encryption;
    using ICSharpCode.SharpZipLib.GZip;
    using ICSharpCode.SharpZipLib.Tar;
    using ICSharpCode.SharpZipLib.Zip;
    using System.Windows.Forms;

    using Radcom;Error  WHY?*********************


    namespace ZipUnZipClient
    {

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
             
            }
            private void button1_Click(object sender, EventArgs e)
            {
                localhost.Service myservice=new localhost.Service();
                textBox1.Text = myservice.MyMethod();
            }


    }
              
    my questions
    1-why do erros that displayed occured?
    i add ICSharpCode.SharpZipLib.dll to my program.
    2-i can not see compression of message.why?
    i can see this output:

      <?xml version="1.0" encoding="utf-8" ?>
      <string xmlns="http://tempuri.org/"><NewDataSet> <Table> <RegionID>1</RegionID> <RegionDescription>Eastern </RegionDescription> </Table> <Table> <RegionID>2</RegionID> <RegionDescription>Western </RegionDescription> </Table> <Table> <RegionID>3</RegionID> <RegionDescription>Northern </RegionDescription> </Table> <Table> <RegionID>4</RegionID> <RegionDescription>Southern </RegionDescription> </Table> <Table> <RegionID>5</RegionID> <RegionDescription>xxx </RegionDescription> </Table> <Table> <RegionID>6</RegionID> <RegionDescription>xxx </RegionDescription> </Table> </NewDataSet></string>

    please help me
    thanks

  • 08-21-2008 9:44 PM In reply to

    Re: compression of message in web service

     Hi,

    There is too much code without explanation here.  I looked for error and found two places marked but no indication of the error.  It was with using statements so presumably you havent got assembly references sort outin whatever environment you are are using #Dev I presume :-)

    You need to have a look into how referencing assemblies works.  Your ide should allow you to add a reference to the assemblies whereever they are.  have a look at the documentation on this.

    hth, -jr-

Page 1 of 1 (2 items)
Powered by Community Server (Commercial Edition), by Telligent Systems
Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.