作者:jiankunking 出处:http://blog.csdn.net/jiankunking


WCF 术语:

• 消息
– 消息是一个独立的数据单元,它可能由几个部分组成,包含消息正文和消息头。
• 服务
– 服务是一个构造。它公开一个或多个终结点。当中每一个终结点都公开一个或多个服务操作。
• 终结点
– 终结点是用来发送或接收消息(或执行这两种操作)的构造。 终结点包含一个定义消息能够发送到的目的地的位置(地址)、一个描写叙述消息应怎样发送的通信机制规范(绑定)以及对于能够在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)— 该定义还描写叙述了能够发送何种消息。

– WCF 服务作为一个终结点集合向外界公开。

小注:

WCF服务即在服务端为client提供一系列方法的集合。这些方法能够是在一个类中的,也能够是包含在不同类中的。终结点即是指这些类,即一系列方法的入口。

创建服务协定: 

• 类或接口都能够定义服务协定
• 建议使用接口。由于接口能够直接对服务协定建模
• 服务协定接口具有托管接口的全部长处:
– 服务协定接口能够扩展不论什么数量的其它服务协定接口。
– 一个类能够通过实现服务协定接口来实现随意数量的服务协定。
– 能够通过更改接口实现来改动服务协定的实现。而让服务协定保持不变。

– 能够通过实现旧接口和新接口来确定服务的版本号。 老client连接到原始版本号。而新client则能够连接到较新的版本号。

• 定义服务协定
– 在类或接口上使用 ServiceContractAttribute 属性标记

• 定义服务操作
 – 在方法上使用 OperationContractAttribute 属性对其进行标记

• 參数和返回值
– 每一个操作都有一个返回值和一个參数。即使它们为 void。

能够使用局部方法将对对象的引用从一个对象传递到还有一个对象,但与局部方法不同的是,服务操作不会传递对对象的引用。 它们传递的仅仅是对象的副本。
– 这一点非常重要,这是由于參数或返回值中使用的每一个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。
– 默认情况下。基元类型是可序列化的。.NET Framework 中的非常多类型都是可序列化的。

创建服务协定  服务操作的消息模式

1、请求/答复模式
– 通过请求/答复模式。请求发送方(client应用程序)将接收与请求相关的答复。 这是默认的模式,由于它既支持传入操作(一个或多个參数传递到该操作中 )。也 支持返回操作(该操作将一个或多个输出值传回给调用方)

[OperationContract]
string Hello(string greeting);

–请注意,除非指定其它基础消息模式,否则,即使服务操作返回void(在 Visual Basic 中为 Nothing)。也属于请求/答复消息交换。
– 操作的结果是:除非client异步调用操作,否则client将停止处理。直到收到返回消息,即使该消息正常情况下为空时也是如此。
缺点
– 假设执行操作须要非常长的时间,则会减少client性能和响应能力
• 长处
– 响应消息中可返回 SOAP 错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况

2、单向模式

– 假设 WCF 服务应用程序的client不必等待操作完毕。而且不处理 SOAP 错误,则该操作能够指定单向消息模式。

–  单向操作是client调用操作并在 WCF 将消息写入网络后继续进行处理的操作。 通常这意味着。除非在出站消息中发送的数据极其庞大,否则client差点儿马上继续执行(除非发送数据时出错)。此种类型的消息交换模式支持从client到服务应用程序的相似于事件的行为。
– 若要为返回 void 的操作指定单向消息交换。请将 IsOneWay 属性设置为 true。默觉得false.

[OperationContract(IsOneWay=true)]
void Hello(string greeting);

此方法与前面的请求/答复演示样例同样,可是,将 IsOneWay属性设置为 true 意味着虽然方法同样。服务操作也不会发送返回消息,而client将在出站消息抵达通道层时马上返回。

使用 IsOneWay=true 标记的操作不得声明输出參数、引用參数或返回值

3、双工模式

– 双工模式的特点是,不管使用单向消息发送还是请求/答复消息发送方式,服务和client均能够独立地向对方发送消息。 对于必须直一( 接与client通信或向消息交换的随意 方提供异步体验 包含相似于事件的行为)的服务来说,这样的双向通信形式非常实用
– 由于存在与client通信的附加机制,双向模式比请求/答复或单向模式要略为复杂
若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的 ServiceContractAttribute 属性 (attribute)的 CallbackContract 属性 (property)。
– 若要实现双工模式,您必须创建第二个接口,该接口包含在client调用的方法声明

[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);
}

小注:

• 面向服务的应用程序(比如 Windows Communication Foundation(WCF) 应用程序)设计为与 Microsoft 平台和非 Microsoft 平台上的最大可能数量的client应用程序进行互操作。
• 为了获得最大可能的互操作性,建议您使用 DataContractAttribute 和DataMemberAttribute 属性对您的类型进行标记,以创建数据协定。

• 数据协定是服务协定的一部分,用于描写叙述您的服务操作交换的数据。

• 数据协定是可选的样式协定:除非您显式应用数据协定属性,否则不会序列化不论什么类型或数据成员
• 数据协定与托管代码的訪问范围无关 能够对私有数据成员进行序列化。并将其发送到其它位置。以便能够公开訪问它们
• WCF 处理用于启用操作功能的基础 SOAP 消息的定义,并处理数据类型到消息正文的序列化和从消息正文进行的反序列化。

数据类型一旦序列化,您就无需在设计操作时考虑基础消息交换基础结构
• 能够使用其它序列化机制。 标准 ISerializable, SerializableAttribute和 IXmlSerializable 机制都可用于处理数据类型到基础 SOAP 消息的序列化。这些消息可将数据类型从一个应用程序带到还有一个应用程序

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 參数要求操作具有基础响应消息,才干够将已改动的对象传回。 假设操作是单向操作,则将在执行时引发InvalidOerationExcetion 异常

小注:

本文整理自:徐长龙 跟我一起从零開始学WCF系列课程(2):设计和实现服务协定 (Level 200) 教程


WCF 设计和实现服务协定(01)相关推荐

  1. 一起谈.NET技术,使用WCF实现SOA面向服务编程—— 架构设计

    SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就是一种进行系统开发的新的体系架构,在基于SOA架构的系统中,具体应用程序的功能是由 一些松耦合并且具有统一接口定义方式的组件(也就是ser ...

  2. 入门代码教程第一节 如何:定义服务协定

    使用接口创建 Windows Communication Foundation 协定 通过在"开始"菜单中右击"Visual Studio 2005"并选择&q ...

  3. 入门代码教程第二节 如何:实现服务协定

    如何:实现 Windows Communication Foundation 服务协定 实现 WCF 服务协定 创建一个新 CalculatorService 类,该类从用户定义的 ICalculat ...

  4. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店...

    原文:[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店 一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Bytear ...

  5. 【从零开始学微服务】01.微服务的过去与现在

    大家好,欢迎来到万猫学社,跟我一起学,你也能成为微服务专家. 微服务的历史 再介绍什么是微服务之前,我们先了解一下微服务架构的历史,也就是微服务是如何提出来的. 2011年5月 2011年5月,在威尼 ...

  6. 架构设计之「服务限流」

    架构设计之「服务限流」 原文:架构设计之「服务限流」 上一篇我们聊过了架构设计中的「服务隔离」模式,今天我们继续来探索一下在分布式系统架构中的另一个常用的设计:服务限流. 那么,什么是「服务限流」呢? ...

  7. [基础题]4、设计一个家政服务规范: 洗衣服, 扫地, 买菜, 做饭

    /*4.设计一个家政服务规范: 洗衣服do the Laundry, 扫地Sweep, 买菜Food , 做饭CookMeal  设计一个保姆类 Nanny , 保姆需要遵循这些规范 需求:在测试类中 ...

  8. SOA系列文章(二):服务设计原理:服务模式和反模式

    服务设计系列的法则已经发展到最佳通信实践和取样相关编码的程度.本文提供了设计和实现网络服务的基本原理,并且对面向服务的体系结构(SOA)的相关概念做了一个简要的回顾,以及有关于几种模式和反模式的详细讨 ...

  9. HTML5期末大作业:旅游酒店网站设计——旅游酒店服务预订(1页) web网页设计—— 出游

    HTML5期末大作业:旅游酒店网站设计--旅游酒店服务预订(1页) web网页设计-- 出游 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒 ...

最新文章

  1. xp系统蓝屏代码7b_电脑蓝屏重启不求人!学会这个方法,自己就能轻松解决!...
  2. [Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别
  3. 【学习笔记】JS进阶语法一document对象
  4. ThinkPHP5.0中报错could not find driver的解决方式
  5. of介词短语作定语_如何区分介词短语作状语还是作定语
  6. idead断点调试_IDEA---断点调试Debug
  7. 读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号
  8. qcow2磁盘格式分析
  9. linux卡片电脑源码,x4412开发板ibox卡片电脑项目实战9-搭建最简单的linux文件系统...
  10. 麒麟980+巴龙5000!华为Mate 20 X 5G版通过3C认证:支持40W快充
  11. java自动封箱_Java程序员面试,自动封箱/拆箱原理与包装类的缓冲机制你知道么?(转)...
  12. JAVA编程思想——读书笔记 对象的容纳
  13. git版本回退(3)
  14. kafka----kafka connect的使用(一)
  15. paip.提升安全---网站登录密码明文传输的登录高危漏洞解决方案
  16. 怎么修改计算机日志里的用户,修改电脑日志保存位置的方法
  17. 识别图片验证码内容 -- ddddocr识别
  18. win10wifi开关自动弹回_win10突然搜不到wifi了,这个开关点不动,点了会自动变回去...
  19. 教你做Android逆向
  20. 解决手机不能设置DeviceOwner权限提示already provisioned问题

热门文章

  1. 2022年的几个小目标
  2. 既然他人的成功与自己无关,何必过于关注他人?
  3. 银行的双重生物识别实验,是双重麻烦还是双重安全?
  4. 性能媲美BERT,参数量仅为1/300,谷歌最新的NLP模型
  5. SAP ECC APO Integration - CIF 简介
  6. 华为(苏州)人工智能创新中心正式揭牌
  7. 刚刚,谷歌终于回应AI专利争议:怕被碰瓷,抢先下手,永不牟利
  8. 最新|全球药企15强(附名单)
  9. OpenCV对象检测实例
  10. AI就是“大数据+机器学习”?答案是否定的