WCF 服务契约

四种契约

  1. 服务契约
  2. 数据契约
  3. 消息契约
  4. 应用契约

ServiceContractAttribute
– 定义服务操作
OperationContractAttribute
– 方法作为公共服务契约的一部分暴露出来

[ServiceContract(Name = "GigManagerServiceContract", Namespace = "http://www.localhost.com/samples/2006/06", SessionMode = SessionMode.Required)]
public interface IGigManagerService
{
    [OperationContract(Name="SaveGig", Action="http://www.localhost.com/samples/2006/06/GigManagerServiceContract/SaveGig", ReplyAction="http://www.thatindigogirl.com/samples/2006/06/GigManagerServiceContract/SaveGigResponse")]
    void SaveGig([MessageParameter(Name=”LinkItem”)]LinkItem item);

    [OperationContract(Name="GetGig", Action="http://www.localhost.com/samples/2006/06/GigManagerServiceContract/GetGig", ReplyAction="http://www.thatindigogirl.com/samples/2006/06/GigManagerServiceContract/GetGigResponse")]
    LinkItem GetGig();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class GigManagerService : IGigManagerService
{
}
ServiceContractAttribute 可用于接口与类
我们最好用服务契约(ServiceContractAttribute)来定义接口(Interface)。
ServiceContract 属性:
  • Name  自定义接口或方法的名称
  • Namespace 自定义命名空间
  • SessionMode 设置服务契约的 Session 方式,包括 Allowe、NotAllowed、Required。SessionMode 需要相应的 Binding 支持,默认情况下会自动启用,另外我们还会和 ServiceBehaviorAttribute.InstanceContextMode 配合使用来管理服务对象的生命周期。
  • CallbackContract:设置 duplex 模式时的回调类型。
  • ProtectionLevel:指定消息保护方式,可以对消息进行加密和签名处理。
  • ConfigurationName: 其设置信息在配置文件中的名称。

OperationContract 属性:

  • AsyncPattern:用于定义异步服务方法。
  • IsInitiating:指示服务方法能否启动一个 Session。
  • IsTerminating:指示服务方法调用完成是否结束 Session。
  • Action: Web调用地址
  • ReplyAction :调用后回传的地址

[MessageParameter(Name=”LinkItem”)] /[Retrun MessageParameter(Name=”LinkItem”)] :自定义参数或返回名称名称,映射

 

数据契约

我们还可以使用 DataContractAttribute、DataMemberAttribute 来标注自定义数据类型,这样我们就可以在服务方法中传递复杂的数据体了。使用之前,我们需要添加 System.Runtime.Serialization.dll 引用。由此我们可以看出其基本的开发模式,那就是使用 ServiceContract、OperationContract 执行运算,而使用 DataContract、DataMember 作为可序列化的数据载体。当然,我们也可以使用 "[Serializable]" 代替 "[DataContract]"。

DataContract

总是要提供命名空间(Namespace)– Web service的规范要求使用“schemas”前缀来表示服务目标的命名空间

[DataContract(Name = "LinkItem_Contract", Namespace = http://schemas.localhost.com/samples/2006/06)]

  • Name / Namespace:自定义名称和命名空间。
 

DataMember

[DataMember(Name = "MyId", IsRequired = false, Order = 0)]
  • Name:自定义名称。
  • IsRequired:指示该成员序列化前必须被赋值。
  • Order 显示排序,缺省按照字母表顺序排列

已知类型(Known Types)

允许在服务契约中使用多态的行为

LinkItem 派生了三个类

在类上声明

[DataContract(Namespace = "http://schemas.thatindigogirl.com/samples/2006/06")]
[KnownType(typeof(GigInfo))]
[KnownType(typeof(PhotoLink))]
[KnownType(typeof(MP3Link))]
public class LinkItem : IExtensibleDataObject
{
}

在接口中声明

[ServiceContract(Name = "GigManagerContract", Namespace ="http://www.thatindigogirl.com/samples/2007/07")]
[ServiceKnownType(typeof(GigInfo))]
[ServiceKnownType(typeof(PhotoLink))]
[ServiceKnownType(typeof(MP3Link))]
public interface IGigManagerService
{
    [OperationContract]
    void SaveLink(LinkItem item);
    [OperationContract]
    LinkItem GetLink(string id);
}
还可在配置文件中声明
 
posted @ 2009-08-12 14:54  幽灵湖  阅读(787)  评论(0编辑  收藏  举报