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])); } } } }