在.Net 中我们可以利用SoapExtension 对Web Service 中的Soap 消息进行处理,如加密信息,将请求保存到日志文件等。
我在网上搜了很久都没能找到能将SoapExtension 讲的透彻的文章。特别是两个流的关系问题。根据实验,我得到了如下结论,如不正确请大家指正:
1.SoapExtension 类
要实现Soap 扩展就必须继承这个类,并实现他的虚方法。GetInitilizer 和 Initilize 方法就不再赘述了,MSDN 上讲的很清楚了。
1.1 StreamChain 方法
如果我们需要修改Soap消息,我们就必须重写StreamChain方法,并返回一个新流。Asp.net 在内部将这些流构成了一个链,消息流经所有的链。 我们必须将传入的流保存至私有字段中,并返回一个新流。关于两个流的关系,将在ProcessMessage中说明。通常,我们将StreamChain实现如下:










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中的消息发送给客户端。
通常,我们至少应该书写如下代码






















