前言:
- 在前面的文章中,我们定义的服务协定上都会有一个ServiceContract的特性来修饰,这是因为服务契约的实现要靠ServiceContractAttribute 属性定义,然后使用一个或多个类(或接口)方法中的 OperationContractAttribute 属性定义协定的服务操作。 实现服务协定后并将其与WCF 绑定和 EndpointAddress 对象一起使用时,此服务协定将公开以供客户端使用。
- 公开的信息由 ServiceContractAttribute 表示,其接口与 Web 服务描述语言 (WSDL) <portType> 元素松散相关。 服务协定可用于服务端以指定服务终结点向调用方公开的内容。 它也可以在客户端使用,以指定客户端与终结点通信的协定
WSDL(Web Service Description Language)Web服务器描述语言是用XML文档来描述Web服务的标准,是Web服务的接口定义语言,由Ariba、
Intel、IBM、MS等共同提出,通过WSDL,可描述Web服务的三个基本属性:
服务做些什么——服务所提供的操作(方法)
如何访问服务——和服务交互的数据格式以及必要协议
服务位于何处——协议相关的地址,如URL
在WCF中,WSDL是元数据交换的一种数据格式,通过它的描述,WCF服务程序间就可以进行相应的数据交换,甚至是跨平台的应用间也可以进行数据交换。
服务协定的属性:
当我们在服务契约接口上加上ServiceContract修饰时,可以看到它有两个构造函数,一个是没有参数的。还有一个拥有以下参数:
- Name:获取或设置 Web 服务描述语言 (WSDL) 中的 <portType> 元素的名称。设置此名称后,默认生成的代理类为该名称+Client。
- Namespace:获取或设置 Web 服务描述语言 (WSDL) 中的 <portType> 元素的命名空间。
- ConfigurationName:用于查找应用程序配置文件中的服务元素的名称。 默认值是服务实现类的名称。
- ProtectionLevel:使用 ProtectionLevel 属性指定协定绑定对公开协定的终结点要求的加密和/或数字签名的程度。 在此设置的值是为包括错误在内的所有操作消息提供的默认值。
- SessionMode:获取或设置是否允许、不允许或要求会话。使用 SessionMode 属性来要求在终结点之间支持会话的绑定。 会话就是将在两个或多个终结点之间交换的消息集相互关联的方式。 如果您的服务支持信道会话,则可以使用 InstanceContextMode 属性指定您的服务协定实现实例与信道会话实例之间的关系。 如果绑定不支持会话,则会引发异常。
- CallbackContract:获取或设置当协定为双工协定时的回调协定类型。在 CallbackContract 属性中指定一个接口,该属性表示双向(双工)消息交换中所需的反向协定。 这使得客户端应用程序能够侦听入站操作调用,该调用可以由服务器端服务应用程序独立于客户端活动进行发送。 具有单向操作的回调协定表示从客户端可以处理的服务发出的调用。
WCF服务协定示例:
- 解决方案如下:
- 工程结构说明:
WcfService:WCF服务应用程序。为简单说明,我们将别的代码删除,只留下GetData方法。IService1.cs的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; using System.Net.Security; namespace WcfService { [ServiceContract(Name="WcfServiceContract", Namespace="http://wangweimutou.WcfServiceContract", SessionMode=SessionMode.Allowed, ProtectionLevel=ProtectionLevel.None, ConfigurationName="Service1")] public interface IService1 { [OperationContract] string GetData(int value); } }
Service1.svc的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WcfService { public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } } }
点击Service1.svc在浏览器中,我们可以查看它的WSDL文件,由于本文只注重讲服务协定的属性。所以我们就把WSDL当成普通的XML文件来看,从中可以看到部分设置
的属性已经改变了,至于别的属性应用,可以查看WCF初探-5:WCF消息交换模式之双工通讯(Duplex)和WCF初探-13:WCF客户端为双工服务创建回调对象两篇博文。