winform 客户端调用SoapExtension的方法

using System; 

using System.Web.Services; 

using System.Web.Services.Protocols; 

using System.IO; 

 

namespace SunLibrary.Web 

{ 

	/*  

	 **********服务器端配置********** 

	在WebService项目中,增加Soap扩展有两种方式,web.config配置或WebMethod配置(推荐使用WebMethod方式只扩展必要的接口) 

	 

	1.web.config配置将对所有WebMethod发生作用。!!但是,无法配置Attribute的自定义属性!! 

	方法:增加SunLibrary.dll程序集作为引用,并且在web.config加入如下声明 

<?xml version="1.0" encoding="utf-8" ?> 

<configuration> 

	<system.web> 

		... 

		<webServices> 

			<soapExtensionTypes> 

				<add type="SunLibrary.Web.SunSoapExtension,SunLibrary" priority="1" group="0"/> 

			</soapExtensionTypes> 

		</webServices> 

		... 

	</system.web>  

</configuration> 

 

	2.WebMethod配置将对单独的WebMethod发生作用 

	方法:在WebMethod定义前加上如下属性 

	[SunLibrary.Web.SunSoapExtensionAttribute(ZipOutput=false,UnzipInput=false)] 

	 

	 **********客户端配置********** 

	在引用WebService的项目中,增加Soap扩展,方法如下: 

	增加SunLibrary.dll程序集作为引用,编辑该引用的Reference.cs文件,为代理类的每个函数增加属性: 

	[SunLibrary.Web.SunSoapExtensionAttribute(ZipOutput=false,UnzipInput=false)] 

	 

	**********补充说明********** 

	支持Soap压缩和其他特性,通过配置Attribute属性使其中的一个或多个属性生效,服务器端和客户端要成套搭配 

	*/ 

	 

	/// <summary> 

	/// Soap扩展的配置参数 

	/// </summary> 

	public struct SunSoapExtensionConfig 

	{ 

		public bool zipOutput; 

		public bool unzipInput; 

	} 

 

	/// <summary> 

	/// 提供Soap扩展的框架,派生类只需重载BeforeDeserialize/AfterDeserialize/BeforeSerialize/AfterSerialize函数完成特定处理 

	/// </summary> 

	public class SunSoapExtension : SoapExtension 

	{ 

		#region 构造函数 

		public SunSoapExtension() 

		{ 

		} 

		#endregion 

 

		#region 成员变量 

 

		/// <summary> 

		/// 定义输入输出流 

		/// </summary> 

		protected Stream networkStream,newStream; 

 

		/// <summary> 

		/// 保存配置属性 

		/// </summary> 

		protected SunSoapExtensionConfig config; 

 

		#endregion 

 

		#region 重载函数 

		public override Stream ChainStream( Stream stream ) 

		{ 

			networkStream = stream; 

			newStream = new MemoryStream(); 

			return newStream; 

		} 

 

		public override object GetInitializer(LogicalMethodInfo methodInfo,SoapExtensionAttribute attribute)  

		{ 

			return ((SunSoapExtensionAttribute)attribute).Config; 

		} 

 

		public override object GetInitializer(Type WebServiceType)  

		{ 

			return config; 

		} 

 

		public override void Initialize(object initializer)  

		{ 

			config = (SunSoapExtensionConfig)initializer; 

		} 

 

		public override void ProcessMessage(SoapMessage message)  

		{ 

			switch (message.Stage)  

			{ 

				case SoapMessageStage.BeforeSerialize: 

					BeforeSerialize( message ); 

					break; 

				case SoapMessageStage.AfterSerialize: 

					AfterSerialize( message ); 

					break; 

				case SoapMessageStage.BeforeDeserialize: 

					BeforeDeserialize( message ); 

					break; 

				case SoapMessageStage.AfterDeserialize: 

					AfterDeserialize( message ); 

					break; 

				default: 

					throw new Exception("invalid stage"); 

			} 

		} 

		#endregion 

 

		#region 需要派生类重载的虚函数(响应消息) 

		public virtual void BeforeSerialize(SoapMessage message) 

		{ 

		} 

 

		public virtual void AfterSerialize(SoapMessage message) 

		{ 

			newStream.Position = 0; 

			if (config.zipOutput) 

				api.GZipCompress(newStream,networkStream); 

			else 

				api.StreamCopy(newStream, networkStream); 

		} 

 

		public virtual void BeforeDeserialize(SoapMessage message) 

		{ 

			if (config.unzipInput) 

				api.GZipDeCompress(networkStream,newStream); 

			else 

				api.StreamCopy(networkStream, newStream); 

			newStream.Position = 0; 

		} 

		 

		public virtual void AfterDeserialize(SoapMessage message) 

		{ 

		} 

		#endregion 

	} 

 

	/// <summary> 

	/// Soap扩展的属性 

	/// </summary> 

	[AttributeUsage(AttributeTargets.Method)] 

	public class SunSoapExtensionAttribute : SoapExtensionAttribute  

	{ 

		private int priority = 1; 

		private SunSoapExtensionConfig config; 

 

		public override Type ExtensionType  

		{ 

			get { return typeof(SunSoapExtension); } 

		} 

 

		public override int Priority 

		{ 

			get { return priority; } 

			set { priority = value; } 

		} 

 

		public bool ZipOutput 

		{ 

			get { return config.zipOutput; } 

			set { config.zipOutput = value; } 

		} 

 

		public bool UnzipInput 

		{ 

			get { return config.unzipInput; } 

			set { config.unzipInput = value; } 

		} 

 

		public SunSoapExtensionConfig Config 

		{ 

			get { return config; } 

		} 

	} 

} 

你可能感兴趣的:(WinForm)