上一节【WCF之旅】第一回:概述中对WCF进行简单的介绍了一下,WCF是一个框架,里面的东西很多,本节会介绍创建一个服务的基本要素。
这里只介绍一些跟创建服务协定相关的术语
• 定义服务协定,在类或接口上使用ServiceContractAttribute 属性标记
[ServiceContract] public interface IService1 {}
• 定义服务操作,在方法上使用 OperationContractAttribute 属性对其进行标记
[ServiceContract] public interface IService1 { [OperationContract] string GetData(int value,ref string strRef,out string strOut); }
• 类或接口都可以定义服务协定,建议使用接口,因为接口可以直接对服务协定建模,接口具有托管接口的所有优点:
• 参数和返回值
[OperationContract]//默认方式
[OperationContract(IsOneWay=true)] void Hello(string greeting);
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required, CallbackContract = typeof(ICalculatorDuplexCallback))] public interface ICalculatorDuplex { [OperationContract(IsOneWay = true)] void Clear(); } public interface ICalculatorDuplexCallback { [OperationContract(IsOneWay = true)] void Equals(double result); } //客户端 public class CallbackHandler : ICalculatorDuplexCallback { public void Equals(double result) { Console.WriteLine("Result({0})", result); } } // Construct InstanceContext to handle messages on callback interface InstanceContext instanceContext = new InstanceContext(new CallbackHandler()); // Create a client ServiceReference1.CalculatorDuplexClient client = new ServiceReference1.CalculatorDuplexClient(instanceContext);
• 面向服务的应用程序(例如Windows Communication Foundation(WCF) 应用程序)设计为与 Microsoft 平台和非 Microsoft 平台上的最大可能数量的客户端应用程序进行互操作。
• 为了获得最大可能的互操作性,建议您使用DataContractAttribute 和DataMemberAttribute 属性对您的类型进行标记,以创建数据协定。
• 数据协定是服务协定的一部分,用于描述您的服务操作交换的数据。
[DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } }
• 数据协定是可选的样式协定:除非您显式应用数据协定属性,否则不会序列化任何类型或数据成员
• 数据协定与托管代码的访问范围无关:可以对私有数据成员进行序列化,并将其发送到其他位置,以便可以公开访问它们
• WCF 处理用于启用操作功能的基础 SOAP 消息的定义,并处理数据类型到消息正文的序列化和从消息正文进行的反序列化。数据类型一旦序列化,您就无需在设计操作时考虑基础消息交换基础结构
• 可以使用其他序列化机制。标准ISerializable, SerializableAttribute和 IXmlSerializable 机制都可用于处理数据类型到基础 SOAP 消息的序列化,这些消息可将数据类型从一个应用程序带到另一个应用程序
• 大部分情况下,您可以使用in 参数(Visual Basic 中为ByVal)、out 和 ref 参数(Visual Basic 中为 ByRef)。 由于 out 和 ref 参数都指示数据是从操作返回的,类似如下的操作签名会指定需要请求/答复操作,即使操作签名返回void 也是如此
[OperationContract] string GetData(int value,ref string strRef,out string strOut);
使数作有响才将• 用out 或ref 参要求操具基础应消息,可以已修改的对象传回。如果操作是单向操作,则将在运行时引发InvalidOperationException 异常
首先看到一个WCF,各个成员在哪里,有什么标记,有哪些成员,本节就简单的介绍了WCF服务基本成员,认识了服务协定、数据协定、消息模式等,就可以自己动手构建WCF服务了。