Web Service 中的SoapExtension 学习

 在.Net 中我们可以利用SoapExtension 对Web Service 中的Soap 消息进行处理,如加密信息,将请求保存到日志文件等。

     我在网上搜了很久都没能找到能将SoapExtension 讲的透彻的文章。特别是两个流的关系问题。根据实验,我得到了如下结论,如不正确请大家指正:

1.SoapExtension  类

    要实现Soap 扩展就必须继承这个类,并实现他的虚方法。GetInitilizer 和 Initilize 方法就不再赘述了,MSDN 上讲的很清楚了。

    1.1 StreamChain 方法

          如果我们需要修改Soap消息,我们就必须重写StreamChain方法,并返回一个新流。Asp.net 在内部将这些流构成了一个链,消息流经所有的链。 我们必须将传入的流保存至私有字段中,并返回一个新流。关于两个流的关系,将在ProcessMessage中说明。通常,我们将StreamChain实现如下:

        

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

    1.2 ProcessMessage 方法

          ProcessMessage 方法是消息处理的核心,在Soap消息处理的四个阶段此方法都会被调用,这使得我们有机会修改要发送的Soap消息。如果我们重写了StreamChain方法,那么在ProcessMessage 中我们至少要处理两个阶段 BeforeDeserialize 和 AfterSerialize 。

          1.2.1 BeforeDeserialize 阶段

                   在此阶段,我们可以从 oldStream 中得到Soap 消息。在修改完消息之后,我们应该将消息拷贝至newStream ,并将newStream的position 设为0;

            1.2.2 AfterSerilize 阶段

                   在此阶段,我们可以从 newStream 得到要发送的Soap消息 。 在修改完之后,我们应该将消息拷贝至oldStream .在拷贝之前,我们应该将 newStream 的position 设为 0;

               Asp.net在内部构造一个链,请求消息首先被输入oldStream , 在被我们处理之后,我们应该将新消息拷贝至newStream,Asp.net 从newStream 得到最后的请求信息。相反的,Asp.net 首先将响应信息发送至newStream ,我们从newStream 得到响应信息,处理之后,我们应将新消息拷贝至oldStream ,Asp.net 最终将oldStream中的消息发送给客户端。

      通常,我们至少应该书写如下代码

public   override   void  ProcessMessage(SoapMessage message)
{
   
switch(message.Stage)
   
{
       
case  SoapMessageStage.BeforeDeserialize:
         Copy(oldStream,newStream);
         newStream.position
=0;
         
break;
       
case  SoapMessageStage.AfterSerialize:
          newStream.position
=0;
          Copy(newStream,oldStream);
   }

}

private   void  Copy(Stream from ,Stream to)
{
   TextReader reader
=new StreamReader(from);
   TextWriter  writer
=new StreamWriter(to);
    writer.WriteLine(reader.ReadToEnd());
   writer.Flush();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值