摘要:Web Services Enhancements 1.0 for Microsoft .NET 工作原理;独立过滤器和过滤器管道的工作原理;配置默认管道的方法;创建自定义过滤器的方法;DIME 适合图片的特点。
下载 Web Services Enhancements 1.0 for Microsoft .NET(英文)。
简介
Web Services Enhancements 1.0 for Microsoft .NET (WSE) 是一个类库,用于实现高级 Web 服务协议。WSE 的体系结构模型基于处理入站和出站 SOAP 消息的过滤器管道。过滤器可以与 ASP.NET Web 服务基础结构集成在一起,也可以单独使用。本文深入探讨了 WSE 管道技术的工作原理,介绍了有关单独过滤器和过滤器管道的工作原理、配置默认管道的方法、创建自定义过滤器的方法以及 DIME 适合图片的特点。
以过滤器为中心的模型
WSE 是一种将高级 Web 服务协议应用到 SOAP 消息的引擎。它要求向出站 SOAP 消息写入标头,从入站 SOAP 消息读取标头;它还要求转换 SOAP 消息正文。例如,按照 WS-Security 规范中定义的那样加密出站消息正文和解密入站消息正文。在 WSE 中,这种功能通过过滤器来实现。输出过滤器向消息写入标头,输入过滤器从消息读取标头并检查标头的有效性。此外输出和输入过滤器都可以转换消息的内容。图 1 说明了 WSE 过滤器模型。

图 1:Web Services Enhancements 的过滤器模型
使用单独的过滤器
了解 WSE 如何使用过滤器的最好方法是从一个简单的例子开始。WSE 提供了一对过滤器,用于读写时间戳标头。时间戳标头包含了一些元素,用来表示消息的创建时间和过期时间,指明消息的周期以及何时可以认为该消息失效。时间戳过滤器在 Microsoft.Web.Services.Timestamp 命名空间中定义。顾名思义,TimestampOutputFilter 是一个输出过滤器,用于向 SOAP 消息写入时间戳标头;而 TimestampInputFilter 是一个输入过滤器,用于从 SOAP 消息读取时间戳标头。以下是它们各自的定义:
|
public class TimestampOutputFilter : SoapOutputFilter { public override void ProcessMessage(SoapEnvelope envelope); }
public class TimestampInputFilter : SoapInputFilter { public override void ProcessMessage(SoapEnvelope envelope); } |
两个类都有一个 ProcessMessage 方法,该方法带有一个 SoapEnvelope 类型的参数。Microsoft.Web.Services.SoapEnvelope 类是标准 .NET XML DOM API System.Xml.XmlDocument 的扩展。它具有验证逻辑,可以验证包含有效 SOAP 消息的文档内容;它还具有一些快捷方法和属性,可以创建和访问消息的特定部分,即 Envelope、Header 和 Body 元素。
以下是一个使用时间戳过滤器的简单应用程序。
|
static void Main(string[] args) { // 创建空白的 SOAP 消息 SoapEnvelope env = new SoapEnvelope(); XmlElement body = env.CreateBody(); env.Envelope.AppendChild(body);
// 打印原始消息 Console.WriteLine("原始消息:\n\n{0}\n", env.OuterXml);
// 创建时间戳输出过滤器 TimestampOutputFilter tsOutput = new TimestampOutputFilter();
// 处理消息,写入时间戳标头 tsOutput.ProcessMessage(env);
// 打印输出过滤后的消息 Console.WriteLine("输出过滤后的消息:\n\n{0}\n", env.OuterXml);
// 创建时间戳输入过滤器 TimestampInputFilter tsInput = new TimestampInputFilter();
// 处理消息,读取时间戳标头 tsInput.ProcessMessage(env);
// 打印输入过滤的消息 Console.WriteLine("输入过滤后的消息:\n\n{0}\n", env.OuterXml); } |
本程序首先创建一个 SoapEnvelope 对象,并添加空白的消息正文。然后,创建一个 TimestampOutputFilter 并使用它来处理 SoapEnvelope,向消息写入时间戳标头。最后,该程序创建一个 TimestampInputFilter 并使用它来处理 SoapEnvelope,从消息读取时间戳标头。程序执行的每一步都将消息内容打印到控制台。以下是输出结果(已经过格式编排)。
原始消息:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body/> </soap:Envelope> |
输出过滤后的消息:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <wsu:Timestamp xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"> <wsu:Created>2002-11-14T19:03:27Z</wsu:Created> <wsu:Expires>2002-11-14T19:08:27Z</wsu:Expires> </wsu:Timestamp> </soap:Header> <soap:Body /> </soap:Envelope> |
输入过滤后的消息:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> </soap:Header> <soap:Body /> </soap:Envelope> |
原始的消息只包含一个空白的 Body 元素,没有其他内容。当 TimestampOutputFilter 处理消息时,它用表示消息创建时间和过期时间的元素写入时间戳标头。而当 TimestampInputFilter 处理消息时,则读取时间戳标头。如果到了过期时间,TimestampInputFilter 将抛出一个异常。