zoukankan      html  css  js  c++  java
  • 一步步写自己的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,你似乎没感觉到我们的类的存在。放断点在

  • 相关阅读:
    spring定时器的cronexpression表达式
    Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)
    ORA-12505, TNS:listener does not currently know of SID given in connect desc
    The Network Adapter could not establish the connection
    Shell中的>/dev/null 2>&1 与 2>&1 >/dev/null 与&>/dev/null 的区别
    大道至简、大智若愚—GO语言最佳详解实践
    rsync使用详解
    一次TIME_WAIT和CLOSE_WAIT故障和解决办法
    Go的CSP并发模型实现:M, P, G
    如何优雅打印nginx header和body
  • 原文地址:https://www.cnblogs.com/yeye518/p/2774933.html
Copyright © 2011-2022 走看看