GZip Compress SoapExtension


namespace Microshaoft
{
    using System;
    using System.IO;
    using System.Web.Services.Protocols;
    public class GZipSoapExtension : SoapExtension
    {
        private Stream _originalStream;
        private Stream _workStream;
        public override Stream ChainStream(Stream stream)
        {
            _originalStream = stream;
            _workStream = new MemoryStream();
            return _workStream;
        }
        public override object GetInitializer
                                    (
                                        LogicalMethodInfo methodInfo
                                        , SoapExtensionAttribute attribute
                                    )
        {
            return null;
        }
        public override object GetInitializer(Type WebServiceType)
        {
            return null;
        }
        public override void Initialize(object initializer)
        {
            //to do ...
        }
        public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize :
                    break;
                case SoapMessageStage.AfterSerialize :
                    CompressStream();
                    break;
                case SoapMessageStage.BeforeDeserialize :
                    DecompressStream(); 
                    break;
                case SoapMessageStage.AfterDeserialize :
                    break;
                default :
                    throw new Exception("invalid stage") ;
            }
        }
        public void CompressStream()
        {
            //压缩 响应
            Stream stream = CompressHelper.GZipCompress(_workStream);
            byte[] buffer = CompressHelper.ReadStreamToBytes(stream);
            _originalStream.Write(buffer, 0, buffer.Length);
        }
        public void DecompressStream()
        {
            //解压 请求
            byte[] bytes = CompressHelper.ReadStreamToBytes(_originalStream);
            bytes = CompressHelper.GZipDecompress(bytes);
            _workStream.Write(bytes, 0, bytes.Length);
            _workStream.Position = 0;
        }
    }
    [AttributeUsage(AttributeTargets.Method)]
    public class GZipSoapExtensionAttribute : SoapExtensionAttribute
    {
        private int _priority;
        public override int Priority
        {
            get
            {
                return _priority;
            }
            set
            {
                _priority = value;
            }
        }
        public override Type ExtensionType
        {
            get
            {
                return typeof(GZipSoapExtension);
            }
        }
    }
}
namespace Microshaoft
{
    using System;
    using System.Text;
    using System.IO;
    using System.IO.Compression;
    public class CompressHelper
    {
        public static byte[] ReadStreamToBytes(Stream stream)
        {
            byte[] buffer = new byte[64 * 1024];
            int r = 0;
            int l = 0;
            long position = -1;
            if (stream.CanSeek)
            {
                position = stream.Position;
                stream.Position = 0;
            }
            MemoryStream ms = new MemoryStream();
            while (true)
            {
                r = stream.Read(buffer, 0, buffer.Length);
                if (r > 0)
                {
                    l += r;
                    ms.Write(buffer, 0, r);
                }
                else
                {
                    break;
                }
            }
            byte[] bytes = new byte[l];
            ms.Position = 0;
            ms.Read(bytes, 0, (int) l);
            ms.Close();
            ms = null;
            if (position >= 0)
            {
                stream.Position = position;
            }
            return bytes;
        }
        public static byte[] GZipCompress(byte[] DATA)
        {
            MemoryStream ms = new MemoryStream();
            GZipStream stream = new GZipStream(ms, CompressionMode.Compress, true);
            stream.Write(DATA, 0, DATA.Length);
            stream.Close();
            stream.Dispose();
            stream = null;
            byte[] buffer = ReadStreamToBytes(ms);
            ms.Close();
            ms.Dispose();
            ms = null;
            return buffer;
        }
        public static byte[] GZipDecompress(byte[] data)
        {
            MemoryStream ms = new MemoryStream(data);
            GZipStream stream = new GZipStream(ms, CompressionMode.Decompress);
            byte[] buffer = ReadStreamToBytes(stream);
            ms.Close();
            ms.Dispose();
            ms = null;
            stream.Close();
            stream.Dispose();
            stream = null;
            return buffer;
        }
        public static Stream GZipCompress(Stream DATA)
        {
            byte[] buffer = ReadStreamToBytes(DATA);
            MemoryStream ms = new MemoryStream();
            GZipStream stream = new GZipStream(ms, CompressionMode.Compress, true);
            stream.Write(buffer, 0, buffer.Length);
            stream.Close();
            stream.Dispose();
            stream = null;
            if (ms.CanSeek)
            {
                ms.Position = 0;
            }
            return ms;
        }
        public static Stream GZipDecompress(Stream data)
        {
            byte[] buffer = ReadStreamToBytes(data);
            MemoryStream ms = new MemoryStream(buffer);
            GZipStream stream = new GZipStream(ms, CompressionMode.Decompress);
            if (stream.CanSeek)
            {
                stream.Position = 0;
            }
            return stream;
        }
        public static byte[] DeflateCompress(byte[] DATA)
        {
            MemoryStream ms = new MemoryStream();
            DeflateStream stream = new DeflateStream(ms, CompressionMode.Compress, true);
            stream.Write(DATA, 0, DATA.Length);
            stream.Close();
            stream.Dispose();
            stream = null;
            byte[] buffer = ReadStreamToBytes(ms);
            ms.Close();
            ms.Dispose();
            ms = null;
            return buffer;
        }
        public static byte[] DeflateDecompress(byte[] data)
        {
            MemoryStream ms = new MemoryStream(data);
            DeflateStream stream = new DeflateStream(ms, CompressionMode.Decompress);
            byte[] buffer = ReadStreamToBytes(stream);
            ms.Close();
            ms.Dispose();
            ms = null;
            stream.Close();
            stream.Dispose();
            stream = null;
            return buffer;
        }
        public static Stream DeflateCompress(Stream DATA)
        {
            byte[] buffer = ReadStreamToBytes(DATA);
            MemoryStream ms = new MemoryStream();
            DeflateStream stream = new DeflateStream(ms, CompressionMode.Compress, true);
            stream.Write(buffer, 0, buffer.Length);
            stream.Close();
            stream.Dispose();
            stream = null;
            if (ms.CanSeek)
            {
                ms.Position = 0;
            }
            return ms;
        }
        public static Stream DeflateDecompress(Stream data)
        {
            byte[] buffer = ReadStreamToBytes(data);
            MemoryStream ms = new MemoryStream(buffer);
            DeflateStream stream = new DeflateStream(ms, CompressionMode.Decompress);
            if (stream.CanSeek)
            {
                stream.Position = 0;
            }
            return stream;
        }
    }
}
//==================================================================================================
// WebService.asmx
//<%@ WebService Language="c#" Class="Microshaoft.Service1Class" Debug="true"%>
namespace Microshaoft
{
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;
    using System.Collections.Generic;
    using System.Data;
    [WebService(Namespace="http://www.microshaoft.com/")]
    public class Service1Class : WebService
    {
        [WebMethodAttribute]
        [Microshaoft.GZipSoapExtension()]
        public string HelloWorld(string x)
        {
            return string.Format("hello {0}", x);// + a;
        }
        [WebMethod]
        [Microshaoft.GZipSoapExtension()]
        public DataSet HelloWorld1(DataSet x)
        {
            x.Tables[0].Rows[0][1] += "\tserver";
            return x;//string.Format("hello {0}", x);// + a;
        }
    }
    public class aaResponse
    {
        public string Name;
        public int age;
        public byte[] data;
    }
    public class aaRequest
    {
        public string Name;
        public int age;
        
    }
}
//==================================================================================================
//Proxy Client
namespace ConsoleApplication
{
    using System;
    using System.Data;
    using Proxy;
        /// <summary>
        /// Class1 的摘要说明。
        /// </summary>
    public class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        //[STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            Service1Class x = new Service1Class();
            string s = x.HelloWorld("于溪玥");
            Console.WriteLine(s);
            DataSet d = x.HelloWorld1(CreateDataSet());
            string ss = d.Tables[0].Rows[0][1].ToString();
            Console.WriteLine(ss);
            Console.WriteLine(Environment.Version.ToString());
        }
        private static DataSet CreateDataSet()
        {
            DataSet dataSet = new DataSet();
            // Create two DataTable objects using a function.
            DataTable table1 = MakeTable("idTable1", "thing1");
            DataTable table2 = MakeTable("idTable2", "thing2");
            dataSet.Tables.Add(table1);
            dataSet.Tables.Add(table2);
            return dataSet;
            //Console.WriteLine(dataSet.Tables.Count)
        }
        private static DataTable MakeTable
                            (
                                string c1Name
                                , string c2Name
                            )
        {
            DataTable table= new DataTable();
            //' Add two DataColumns
            DataColumn column = new DataColumn(c1Name, typeof(int));
            table.Columns.Add(column);
            column = new DataColumn(c2Name, typeof(string));
            table.Columns.Add(column);
            table.Rows.Add(1,"aa");
            table.Rows.Add(2, "bb");
            return table;
        }
    }
}
namespace Proxy
{
    //------------------------------------------------------------------------------
    // <auto-generated>
    //     此代码由工具生成。
    //     运行时版本:2.0.50727.3053
    //
    //     对此文件的更改可能会导致不正确的行为,并且如果
    //     重新生成代码,这些更改将会丢失。
    // </auto-generated>
    //------------------------------------------------------------------------------
    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Serialization;
    // 
    // 此源代码由 wsdl 自动生成, Version=2.0.50727.42。
    // 
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="Service1ClassSoap", Namespace="http://www.microshaoft.com/")]
    public partial class Service1Class : System.Web.Services.Protocols.SoapHttpClientProtocol {
        
        private System.Threading.SendOrPostCallback HelloWorldOperationCompleted;
        
        private System.Threading.SendOrPostCallback HelloWorld1OperationCompleted;
        
        /// <remarks/>
        public Service1Class() {
            this.Url = "http://test.v20.asp.net/SoapExtension/Noname1.asmx";
        }
        
        /// <remarks/>
        public event HelloWorldCompletedEventHandler HelloWorldCompleted;
        
        /// <remarks/>
        public event HelloWorld1CompletedEventHandler HelloWorld1Completed;
        
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.microshaoft.com/HelloWorld", RequestNamespace="http://www.microshaoft.com/", ResponseNamespace="http://www.microshaoft.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [Microshaoft.GZipSoapExtension()]
        public string HelloWorld(string x) {
            object[] results = this.Invoke("HelloWorld", new object[] {
                        x});
            return ((string)(results[0]));
        }
        
        /// <remarks/>
        public System.IAsyncResult BeginHelloWorld(string x, System.AsyncCallback callback, object asyncState) {
            return this.BeginInvoke("HelloWorld", new object[] {
                        x}, callback, asyncState);
        }
        
        /// <remarks/>
        public string EndHelloWorld(System.IAsyncResult asyncResult) {
            object[] results = this.EndInvoke(asyncResult);
            return ((string)(results[0]));
        }
        
        /// <remarks/>
        public void HelloWorldAsync(string x) {
            this.HelloWorldAsync(x, null);
        }
        
        /// <remarks/>
        public void HelloWorldAsync(string x, object userState) {
            if ((this.HelloWorldOperationCompleted == null)) {
                this.HelloWorldOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorldOperationCompleted);
            }
            this.InvokeAsync("HelloWorld", new object[] {
                        x}, this.HelloWorldOperationCompleted, userState);
        }
        
        private void OnHelloWorldOperationCompleted(object arg) {
            if ((this.HelloWorldCompleted != null)) {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.HelloWorldCompleted(this, new HelloWorldCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }
        
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.microshaoft.com/HelloWorld1", RequestNamespace="http://www.microshaoft.com/", ResponseNamespace="http://www.microshaoft.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [Microshaoft.GZipSoapExtension()]
        public System.Data.DataSet HelloWorld1(System.Data.DataSet x) {
            object[] results = this.Invoke("HelloWorld1", new object[] {
                        x});
            return ((System.Data.DataSet)(results[0]));
        }
        
        /// <remarks/>
        public System.IAsyncResult BeginHelloWorld1(System.Data.DataSet x, System.AsyncCallback callback, object asyncState) {
            return this.BeginInvoke("HelloWorld1", new object[] {
                        x}, callback, asyncState);
        }
        
        /// <remarks/>
        public System.Data.DataSet EndHelloWorld1(System.IAsyncResult asyncResult) {
            object[] results = this.EndInvoke(asyncResult);
            return ((System.Data.DataSet)(results[0]));
        }
        
        /// <remarks/>
        public void HelloWorld1Async(System.Data.DataSet x) {
            this.HelloWorld1Async(x, null);
        }
        
        /// <remarks/>
        public void HelloWorld1Async(System.Data.DataSet x, object userState) {
            if ((this.HelloWorld1OperationCompleted == null)) {
                this.HelloWorld1OperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorld1OperationCompleted);
            }
            this.InvokeAsync("HelloWorld1", new object[] {
                        x}, this.HelloWorld1OperationCompleted, userState);
        }
        
        private void OnHelloWorld1OperationCompleted(object arg) {
            if ((this.HelloWorld1Completed != null)) {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.HelloWorld1Completed(this, new HelloWorld1CompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }
        
        /// <remarks/>
        public new void CancelAsync(object userState) {
            base.CancelAsync(userState);
        }
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    public delegate void HelloWorldCompletedEventHandler(object sender, HelloWorldCompletedEventArgs e);
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class HelloWorldCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
        
        private object[] results;
        
        internal HelloWorldCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
                base(exception, cancelled, userState) {
            this.results = results;
        }
        
        /// <remarks/>
        public string Result {
            get {
                this.RaiseExceptionIfNecessary();
                return ((string)(this.results[0]));
            }
        }
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    public delegate void HelloWorld1CompletedEventHandler(object sender, HelloWorld1CompletedEventArgs e);
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class HelloWorld1CompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
        
        private object[] results;
        
        internal HelloWorld1CompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
                base(exception, cancelled, userState) {
            this.results = results;
        }
        
        /// <remarks/>
        public System.Data.DataSet Result {
            get {
                this.RaiseExceptionIfNecessary();
                return ((System.Data.DataSet)(this.results[0]));
            }
        }
    }
}

posted @ 2008-09-24 22:51  于斯人也  阅读(4864)  评论(2编辑  收藏  举报