一步步写自己的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,你似乎没感觉到我们的类的存在。放断点在

posted @ 2012-11-17 16:10  天涯海客  阅读(218)  评论(0编辑  收藏  举报