消息  : 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。
 
 
服务  :  服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。
 
终结点  : 终结点是用来发送或接收消息(或执行着两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)---该定义还描述了可以发送何种消息。
 
(WCF服务作为一个终结点集合向外界公开)
 
 
创建服务协定
类或接口都可以定义服务协定(建议使用接口,因为接口可以直接对服务协定建模)
 
服务协定接口具有托管接口的所有优点:
    服务协定接口可以扩展任意数量的其他服务协定接口。
    一个类可以通过实现服务协定接口来实现任意数量的服务协定。
    可以通过更改接口实现来修改服务协定的实现,而让服务协定保持不变。
    可以通过实现旧接口和新接口来确定服务的版本。老客户端链接到原始版本,而新客户端则可以连接到较新的版本。
 
 
 
创建服务协定:
定义服务协定
    在类或接口上使用ServiceContractAttribute属性标记
 
定义服务操作
    在方法上使用OperationContractAttribute属性对其进行标记
 
参数和返回值
    每个操作都有一个返回值和一个参数,即使他们为void。可以使用局部方法将对对象的引用从一个对象传递到另一个对象,但与局部方法不同的是,服务操作不会传递对对象的引用,它们传递的只是对象的副本。
 
    这一点很重要,这是因为参数或返回值中使用的每个类型都必须是可序列化的,换而言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。
 
    没人情况下,基元类型是可序列化的,.NET Framwork中的很多类型都是可序列化的
 
创建服务协定---服务操作的消息模式
1:请求/答复
    通过请求/答复模式,请求发送方(客户端应用程序)将接受与请求相关的答复。这是默认的模式,因为它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方)
[OperationContract]
string Hello(string greeting);
请注意,除非指定其他基础消息模式,否则,即使服务操作返回void(在VB中为Nothing),也属于请求/答复消息交换
操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。
 
缺点 : 如果执行操作需要很长的时间,则会降低客户端性能和响应能力
优点 :响应消息中可返回SOAP错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况。
 
 
2:单向
    如果WCF服务应用程序的客户端不必等待操作完成,并且不处理SOAP错误,则该操作可以指定单向消息模式
    单向操作是客户端调用操作并在WCF将消息写入网络后继续进行处理的操作。通常这意味着,除非在出站消息中发送的数据及其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。
    若要为返回void的操作指定单向消息交换,请将IsOneWay属性设置为true,默认为false。
[OperationContract(IsOneWay=true)]
void Hello(string greeting);
此方法与前面的请求/答复实例相同,但是,将IsOneWay属性设置为true意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回。
 
 
3:双工
    双工模式的特点是,无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。对于必须直接与客户端通信或向消息交换的任意一方提供异步体验(包括类似于事件的行为)的服务来说,这种双向通信形式非常有用。
    由于存在于客户端通信的附加机制,双向模式比请求/答复或单向模式要略微复杂
    若要设计双工设定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute属性(Attribute)的CallbackContract属性(property)
    若要实现双工模式,必须创建第二个接口,该接口包含在客户端调用的方法声明。
 
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples",SessionMode=SessionMode.Required,CallbackContract=typeof(ICalculatorDuplexCallBcak))] 
public interface ICalculatorDuplex 

[OperationContract(IsOneWay = true)] 
void clear(); 

public interface ICalculatorDuplexCallBcak 

[OperationContract(IsOneWay = true)] 
void Equals(double result); 
[OperationContract(IsOneWay = true)] 
void Equation(string eqn);

}

 
 
创建数据协定
    面向服务的应用程序设计为与Microsoft平台和非Microsoft平台上的最大可能数量的客户端应用程序进行互操作
    为了获取最大可能互操作性,建议您使用DataContactAttribute和DataMemberAttribute属性对您的类型进行标记,以创建数据协定。
    数据协定是服务协定的一部分,用于描述您的服务操作交换的数据。
 
 
数据协定是可选的样式协定:除非显式应用数据协定属性,否则不会序列化任何类型或数据成员。
 
数据协定与托管代码的访问范围无关:可以对私有数据成员进行序列化,并将其发送到其他位置,以便可以公开访问它们。
 
WCF处理用于启用操作功能的基础SOAP消息的定义,并处理数据类型到消息正文的序列化和从消息正文进行的反序列化。数据类型一旦序列化,就无需再设计操作时考虑基础消息交换基础结构。
 
可以使用其他序列化机制。标准ISerializable,SerializableAttribute和IXMLSerializable机智豆可用于处理数据类型到基础SOAP消息的序列化,这些消息可将数据类型从一个应用程序带到另一个应用程序。

WCF第二天的更多相关文章

  1. WCF学习之旅—WCF第二个示例(五)

    二.WCF服务端应用程序 第一步,创建WCF服务应用程序项目 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序.在弹出界面的“名称”对 ...

  2. WCF学习之旅—WCF第二个示例(七)

    三.创建客户端应用程序 若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据. 在第一个步骤中,你将 Windows 窗体项目添加到解 ...

  3. WCF学习之旅—WCF第二个示例(六)

    第五步,创建数据服务 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 在“添加新项”对话框中,选择“Web”节点,然 ...

  4. [老老实实学WCF] 第二篇 配置WCF

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

  5. 老老实实学习WCF[第二篇] 配置wcf

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

  6. (转)[老老实实学WCF] 第二篇 配置WCF

    第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Collections. ...

  7. (转)[老老实实学WCF] 第二篇 配置WCF

    在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Collections.Generic; u ...

  8. 十五天精通WCF——第二天 告别烦恼的config配置

    经常搞wcf的基友们肯定会知道,当你的应用程序有很多的“服务引用”的时候,是不是有一种疯狂的感觉...从一个环境迁移到另外一个环境,你需要改变的 endpoint会超级tmd的多,简直就是搞死了人.. ...

  9. [转]十五天精通WCF——第二天 告别烦恼的config配置

    经常搞wcf的基友们肯定会知道,当你的应用程序有很多的“服务引用”的时候,是不是有一种疯狂的感觉...从一个环境迁移到另外一个环境,你需要改变的 endpoint会超级tmd的多,简直就是搞死了人.. ...

随机推荐

  1. 记录以下boost::shared_ptr的一个使用细节

    shared_ptr<T>::operator->返回的是T*类型指针,非const T*指针.因此通过const shared_ptr<T>&类型的ptr可以直 ...

  2. [原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)

    上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器.每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务.看一下CCLay ...

  3. Sharepoint CAML 增删改查 List

    Lists.UpdateListItems 方法 (websvcLists) Windows SharePoint Services 3   Adds, deletes, or updates the ...

  4. Sea.js学习5——Sea.js的构建工具spm

    如果项目遵循推荐的标准目录结构: foo-module/ |-- dist 存放构建好的文件 |-- src 存放 js.css 等源码 | |-- foo.js | `-- style.css `- ...

  5. 使用pt-stalk分析MySQL的性能波动 (转)

    简介 在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息.另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人 ...

  6. winform基本控件----按钮

    这次来引用一个我们上课时候老师给的一个实验内容,来说一下winform程序设计中的按钮控件的使用.下面是我们老师给的实验内容. 实验目的: 掌握Winform的开发环境. 掌握窗体的创建和基本方法. ...

  7. Corel Painter 15在Surface Pro 4下开启笔触压力感应

    之前一直是用Wacom的板子,所以只需要下载Wacom板子相应的驱动安装即可就能在PS和Corel Painter中开启压力感应来调节笔触出线的粗细.Surface Pro 4的笔是支持压力感应的,但 ...

  8. SG函数模板(转)

    ps:sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3.me ...

  9. 删除空文件夹 清除CS扩展名文件 bat

    删除空文件夹.删的干净.删的彻底. 将下列代码复制到txt中保存.并把后缀.txt命成.bat.然后运行即可. 方案1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  10. RedHat5--yun源无法使用问题解决

    YUM是Redhat Linux在线安装更新及软件的工具,但是这是RHEL5的收费功能,如果没有购买Redhat的服务时不能使用RHEL5的更新源的,会提示注册. 由于CentOS是从Redhat演化 ...