WCF初探-14:WCF服务协定

时间:2022-09-01 08:53:24

前言:

 

  • 在前面的文章中,我们定义的服务协定上都会有一个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服务协定示例:

 

  • 解决方案如下:

  WCF初探-14: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客户端为双工服务创建回调对象两篇博文。

  WCF初探-14:WCF服务协定