说明:本内容来自微软的webcast,讲师为徐长龙。为了用手机阅读方便点,抄录存为txt。
本次课程内容包括
• 创建服务协定
• 数据协定
• Out和Ref参数
创建服务协定—WCF术语
• 消息
– 消息是一个独立的数据单元,它可能由几个部分组成,包括消息
正文和消息头。
• 服务
– 服务是一个构造,它公开一个或多个终结点,其中每个终结点都
公开一个或多个服务操作。
• 终结点
– 终结点是用来发送或接收消息(或执行这两种操作)的构造。终
结点包括一个定义消息可以发送到的目的地的位置(地址)、一
个描述消息应如何发送的通信机制规范(绑定)以及对于可以在
该位置发送或接收(或两者皆可)的一组消息的定义(服务协
定)— 该定义还描述了可以发送何种消息。
– WCF 服务作为一个终结点集合向外界公开。
创建服务协定
• 类或接口都可以定义服务协定
• 建议使用接口,因为接口可以直接对服务协定建模
• 服务协定接口具有托管接口的所有优点:
– 服务协定接口可以扩展任何数量的其他服务协定接口。
– 一个类可以通过实现服务协定接口来实现任意数量的服务协定。
– 可以通过更改接口实现来修改服务协定的实现,而让服务协定保
持不变。
– 可以通过实现旧接口和新接口来确定服务的版本。老客户端连接
到原始版本,而新客户端则可以连接到较新的版本。
创建服务协定
• 定义服务协定
– 在类或接口上使用ServiceContractAttribute 属性标记
• 定义服务操作
– 在方法上使用OperationContractAttribute 属性对其进行标记
• 参数和返回值
– 每个操作都有一个返回值和一个参数,即使它们为void。可以使
用局部方法将对对象的引用从一个对象传递到另一个对象,但与
局部方法不同的是,服务操作不会传递对对象的引用, 它们传递
的只是对象的副本。
– 这一点很重要,这是因为参数或返回值中使用的每个类型都必须
是可序列化的,换言之,该类型的对象必须能够转换为字节流,
并能够从字节流转换为对象。
– 默认情况下,基元类型是可序列化的,.NET Framework 中的很
多类型都是可序列化的。
创建服务协定-服务操作的消息模式1
• 请求/答复
– 通过请求/答复模式,请求发送方(客户端应用程序)将接收与请
求相关的答复。这是默认的模式,因为它既支持传入操作(一个
或多个参数传递到该操作中),也支持返回操作(该操作将一个
或多个输出值传回给调用方)
[OperationContract]
– 请注意,除非指定其他基础消息模式,否则,即使服务操作返回
string Hello(string greeting);
void(在Visual Basic 中为Nothing),也属于请求/答复消息交
换。
– 操作的结果是:除非客户端异步调用操作,否则客户端将停止处
理,直到收到返回消息,即使该消息正常情况下为空时也是如此。
创建服务协定-服务操作的消息模式1
• 缺点
– 如果执行操作需要很长的时间,则会降低客户端性能和响应能力
• 优点
– 响应消息中可返回SOAP 错误,这表明可能在通信或处理中发生
了一些与服务有关的错误状况
创建服务协定-服务操作的消息模式2
• 单向
– 如果WCF 服务应用程序的客户端不必等待操作完成,并且不处
理SOAP 错误,则该操作可以指定单向消息模式。
– 单向操作是客户端调用操作并在WCF 将消息写入网络后继续进
行处理的操作。通常这意味着,除非在出站消息中发送的数据极
其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。
此种类型的消息交换模式支持从客户端到服务应用程序的类似于
事件的行为。
– 若要为返回void 的操作指定单向消息交换,请将IsOneWay 属性
设置为true,默认为false.
[OperationContract(IsOneWay=true)]
void Hello(string greeting);
创建服务协定-服务操作的消息模式2
• 此方法与前面的请求/答复示例相同,但是,将IsOneWay
属性设置为true 意味着尽管方法相同,服务操作也不会
发送返回消息,而客户端将在出站消息抵达通道层时立即
返回
创建服务协定-服务操作的消息模式3
• 双工
– 双工模式的特点是,无论使用单向消息发送还是请求/答复消息发
送方式,服务和客户端均能够独立地向对方发送消息。对于必须
直接与客户端通信或向消息交换的任意一方提供异步体验(包括
类似于事件的行为)的服务来说,这种双向通信形式非常有用
– 由于存在与客户端通信的附加机制,双向模式比请求/答复或单向
模式要略为复杂
– 若要设计双工协定,还必须设计回调协定,并将该回调协定的类
型分配给标记服务协定的ServiceContractAttribute 属性(attribute)
的CallbackContract 属性(property)。
– 若要实现双工模式,您必须创建第二个接口,该接口包含在客户
端调用的方法声明
创建服务协定-服务操作的消息模式3
[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);
[OperationContract(IsOneWay = true)]
void Equation(string eqn);
}
== 演示1 ==
创建数据协定
• 面向服务的应用程序(例如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; }
}
}
创建数据协定
• 数据协定是可选的样式协定:除非您显式应用数据协定属性,否则不
会序列化任何类型或数据成员
• 数据协定与托管代码的访问范围无关:可以对私有数据成员进行序列
化,并将其发送到其他位置,以便可以公开访问它们
• WCF 处理用于启用操作功能的基础 SOAP 消息的定义,并处理数据
类型到消息正文的序列化和从消息正文进行的反序列化。数据类型一
旦序列化,您就无需在设计操作时考虑基础消息交换基础结构
• 可以使用其他序列化机制。标准ISerializable, SerializableAttribute
和IXmlSerializable 机制都可用于处理数据类型到基础SOAP 消息的
序列化,这些消息可将数据类型从一个应用程序带到另一个应用程序
== 演示2 ==
创建数据协定
Out和Ref参数
• 大部分情况下,您可以使用in 参数(Visual Basic 中为ByVal)、
out 和 ref 参数(Visual Basic 中为 ByRef)。由于out 和 ref 参数都
指示数据是从操作返回的,类似如下的操作签名会指定需要请求/答复
操作,即使操作签名返回void 也是如此
[ServiceContract]
public interface IMyContract
{
[OperationContract]
void PopulateData(ref CustomDataType data);
}
使数作有响才将• 用out 或ref 参要求操具基础应消息,可以已修
改的
对象传回。如果操作是单向操作,则将在运行时引发
InvalidOperationException 异常
== 演示3 ==
Out 和Ref 参数
小结
• 创建服务协定
• 数据协定
• Out和Ref参数