Pennant的日常
分享工作上的点点滴滴
posts - 75,comments - 21,views - 66454

一、契约

      任何一个分布式应用程序,都会事先制定好数据交换规则,这个规则正是交换数据的双方(比如服务器端和客户端)能彼此理解对方的依据。在WCF中称之为契约(Contract)。

 

1.契约的分类

    1)用于定义服务操作的服务契约:Service Contract

         这种级别的契约又包括两种:ServiceContract和OperationContract。

         ServiceContract用于类或结构上,用于指示WCF此类或者结构能够被远程调用。

         OperationContract用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。

复制代码
[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);
}
复制代码

 

    2)用于自定义数据结构的数据契约:Data Contract

         数据契约也分为两种:DataContract和DataMember。

         DataContract用于类或者结构上,指示WCF此类或者结构能够被序列化并传输。

         DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或字段能够被序列化并传输。

复制代码
[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; }
    }
}
复制代码

 

    3)用于自定错误异常的异常契约:Fault Contract

         默认情况下,当服务器端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息。此时,我们可以自定义异常信息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。

复制代码
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(OverflowException))]
    string GetData(int value);

    [OperationContract]
    [FaultContract(typeof(OverflowException))]
    CompositeType GetDataUsingDataContract(CompositeType composite);
}
复制代码

 

    4)用于控制消息格式的消息契约:Message Contract

         能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。

复制代码
[MessageContract(IsWrapped = true, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public class MyMessage
{
    string key;
    CompositeType composite;

    [MessageHeader]
    public string key
    {
        get { return key; }
        set { key = value; }
    }

    [MessageBodyMember]
    public CompositeType Composite
    {
        get { return composite; }
        set { composite = value; }
    }
}
复制代码

 

2.契约独立于平台

    它只约束通讯的双方应该遵守什么样的规则,而丝毫不管双方各自采用的是什么样的技术和什么样的操作系统。 

 

二、 Address

      Address通过一个Uri来唯一标示一个WCF的终节点(EndPoint)的,它标示了消息发送的目的地。

 

1.Address的组成

      Address在WCF中用System.ServiceModel.EndpoingAddress对象来表示的,它的结构如下:

     

2.在配置文件中指定Address

      在配置文件中,有两种方式可以指定Address,一种是绝对地址方式,另一种是相对地址方式。

 

3.通过编程方式设置Address

 

三、Binding

      Endpoing包括三个组成部分:1.Address 2.Binding 3.Contract

      Address解决了Endpoint在哪的问题。

      Binding解决的是如何与Endpoint通讯的问题。

      Contract解决了Endpoint提供什么功能的问题。

 

      Binding实现的是客户端和服务端进行通讯的底层细节,包括数据如何传输(比如采用TCP,HTTP等),如何解决安全问题(SSL、Message Level Security等),传输的消息的格式(如text/xml、MTOM、binary等)。

 

1.Binding的组成

      Binding包括三个组成部分:NameSpace、Name和BindingElement。

      Name和NameSpace是服务元数据(meta data)的唯一标志,二者就像Binding的姓名一样,而BindingElement则描述Binding的特征,我们说Binding能解决通讯方式的问题,关键是靠BindingElement来进行描述。

 

2.BindingElement的分类

      BindingElement分为三种类型:

      1)EncodingBindingElement:它用于描述传输数据的编码方式,比如用text/xml进行编码,用binary编码,用MTOM进行编码都是在这个上面定义,每个BindingElement必须包含一个EncodingBindingElement。

      2)TransportBindingElement:它用于描述数据的传输方式,例如使用tcp进行传输,还是用http进行传输,还是用msmq,这些都是由TransportBindingElement来定义,每个BindingElement必须包含一个TransportBindingElement。

      3)ProtocolBindingElement:指定诸如安全性、可靠性、上下文流设置(context flow settings)。

 

3.Binding描述哪些层面的信息

     

4.选择正确的Binding 

       

       

       

posted on   汝熹  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
< 2012年11月 >
28 29 30 31 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示