WSDL 和 XSD 使 ASP.NET Web 服务元数据具有可移植性;它表示数据结构的方法,对于不同平台上使用不同编程模型的其他 Web 服务工具包也可以理解。在某些情况下,这限制了可以从 Web 服务中提供的类型 - XmlSerializer 只能封送可以用 XSD 表示的数据。也就是说,XmlSerializer 将不能封送对象图形,而且对于容器类型的支持也很有限。
尽管这些限制从传统的分布式对象的角度来看似乎很重要,但它们有助于确保与其他 Web 服务框架的互操作性 - 这是松散耦合的 Web 服务模型的基本目标。大量自定义属性使您能够注释数据类型,以控制 XmlSerializer 封送它们的方法,从而增强了对互操作性的支持。因此,您可以细致地控制在对象进行序列化时生成的 XML 的形状。另外,还可以对基于 ASP.NET 的 Web 服务进行调整,以便用文字 XSD 或 SOAP 编码规则(例如,SOAP 第 5 节)来描述消息。文字 XSD 是默认的,而且将成为以后的标准。它还包括 SOAP 编码支持,以便与现有的工具包进行互操作。这对用户很有帮助,特别是当用户需要与现有 Web 服务或客户端(它们需要使用预定义的消息格式进行通信)进行
通信时更是如此。
.NET Remoting、IFormatter 和公共语言运行库
NET Remoting 依赖于 System.Runtime.Serialization 引擎所使用的 IFormatter 接口的可插入实现程序向/从消息中封送数据。有两个格式化
程序, System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 和 System.Runtime.Serialization.Formatters.Soap.SoapFormatter。顾名思义,BinaryFormatter 和 Soap
Formatter 分别以二进制和 SOAP 格式封送类型。对于元数据,.NET Remoting 依赖于公共语言运行库程序集,该程序集包含它们实现的数据类型的所有相关信息,并通过反射提供它。对于元数据而言,依赖于程序集更容易保留全运行时类型的系统保真度。因此,当 .NET Remoting 管线封送数据时,它包括类中所有公共和专有的成员,正确处理对象图形并支持所有的容器类型(例如,System.Collections.Hashtable)。但是,依赖运行时元数据也限制了 .NET Remoting
系统的使用范围 — 客户端必须理解 .NET 体系结构才能与 .NET Remoting 端点进行通信。除了可插入的格式化程序外,.NET Remoting 层还支持可插入的信道,该信道去除了有关消息发送方法的细节。有两种标准的信道,一种用于原始的 TCP,一种用于 HTTP。消息可以独立于格式,通过任意一种信道进行发送。
搅浑水:Remoting 和 Web 服务
SOAP 格式化程序和 HTTP 信道的存在回避了一个问题:可以使用 .NET Remoting 建立 Web 服务吗?答案既是肯定的,又是否定的。标准的 Web 服务技术堆栈不仅依赖于基于 SOAP 的消息,还依赖于消息基于 WSDL 和 XSD 的描述。Remoting 管线能够真正地生成描述端点所产生并使用的消息的 WSDL 定义。但是,如果沿着这条思路走下去,会产生几个
问题。
首先,生成的 WSDL 文件总是用 SOAP 编码规则而不是文字 XSD 来描述消息。虽然现在这不是问题,但随着越来越多的工具完全着眼于架构,这种问题会越来越严重。
第二,生成的 WSDL 文件包括 .NET Remoting 专用的扩展功能。例如,下面是使用 .NET Remoting 提供其行为的一个简单的类。
public class Methods : MarshalByRefObject
{
// The Now method returns the current date and time
public string Now()
{
return System.DateTime.Now.ToString();
}
}
If you generate WSDL from this class, the binding information includes .NET Remoting-specific details, as shown below.
transport='schemas.
xmlsoap.org/soap/http'/>
'schemas.microsoft/clr/nsassem/RemSoap.Methods/methods#Now'/>
...
...
这些额外的元素是合法的,因为 WSDL 规范支持可扩展性。任何运作良好的 Web 服务工具包如果不理