zoukankan      html  css  js  c++  java
  • 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; } 
    		} 
    	} 
    } 
  • 相关阅读:
    Tomcat性能优化总结
    shell 服务器监控 cpu 和 java 占用 CPU 脚本
    编写shell时,遇到let: not found错误及解决办法
    Studio 3T 破解 mogodb
    nginx/iptables动态IP黑白名单实现方案
    创业公司这两年
    致所有的开发者们
    如何成为一名全栈开发工程师
    谈谈在创业公司的几点感触
    推荐阅读《赢在下班后》
  • 原文地址:https://www.cnblogs.com/yeye518/p/2774918.html
Copyright © 2011-2022 走看看