一步步写自己的SoapExtension(一)

最简单的代码


    public class ClientEngine : SoapExtension
    {
        Stream oldStream;
        Stream newStream;
        
string actionName;
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        public ClientEngine()
        {
        }
        
public override object GetInitializer(LogicalMethodInfo methodInfo,SoapExtensionAttribute attribute)
        {
            
return attribute;
        }

        
public override object GetInitializer(Type t)
        {            
            
return null;
        }

        
public override void Initialize(object initializer)
        {
           
        }

        
public override void ProcessMessage(SoapMessage message)
        {
            
switch (message.Stage)
            {
                
case SoapMessageStage.BeforeSerialize:
                    
this.actionName = message.Action;
                    
break;
                
case SoapMessageStage.AfterSerialize:
                    newStream.Position 
= 0;
                    Copy(newStream, oldStream);
                    
break;
                
case SoapMessageStage.BeforeDeserialize:
                    
this.actionName = message.Action;
                    Copy(oldStream, newStream);
                    newStream.Position 
= 0;
                    
break;
                
case SoapMessageStage.AfterDeserialize: break;
                
default:
                    
throw new Exception("invalid stage");
            }
        }

        
public override Stream ChainStream(Stream stream)
        {
            oldStream 
= stream;
            newStream 
= new MemoryStream();
            
return newStream;
        }

        
void Copy(Stream from, Stream to)
        {
            TextReader reader 
= new StreamReader(from);
            TextWriter writer 
= new StreamWriter(to);

            
string strContent = reader.ReadToEnd();
            writer.Write(strContent);
            writer.Flush();
        }
    }

 

注意newStream.Position = 0;这个可是很重要,却很容易忽略。

客户端的app.config配置使用上面的类


  <system.web> 
    
<webServices>
      
<soapExtensionTypes>
        
<add type="Ysd.Web.Security.ClientEngine, Ysd.Web.Security"
             priority
="1" group="High" />
      
</soapExtensionTypes>
    
</webServices> 
  
</system.web> 

 

客户端调用一下webservcie,你似乎没感觉到我们的类的存在。放断点在

转载于:https://www.cnblogs.com/yeye518/archive/2012/11/17/2774933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值