消息  : 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。
 
 
服务  :  服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。
 
终结点  : 终结点是用来发送或接收消息(或执行着两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)---该定义还描述了可以发送何种消息。
 
(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. xmind的第六天

  2. Oracle学习系列1-7

    Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...

  3. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  4. netmon,messageanalyzer

    Microsoft Message Analyzer Operating Guide https://technet.microsoft.com/en-us/library/jj649776.aspx ...

  5. graphql 新API 开发方式

    我们知道 GraphQL 使用 Schema 来描述数据,并通过制定和实现 GraphQL 规范 定义了支持 Schema 查询的 DSQL (Domain Specific Query Langua ...

  6. 如何做好APP测试?

    测试一个App具体包括哪些方面,以及每个方面有什么关键点呢? 测试人员常被看作bug寻找者,但你曾想过他们实际是如何开展测试的吗? 你是否好奇他们究竟都做些什么,以及他们如何在一个典型的技术项目中体现 ...

  7. Fatal error: Call to undefined function imagettftext()解决办法

    Fatal error: Call to undefined function imagettftext()解决办法   我的问题是php编译安装时指定了gd的目录,其实不用指定.就可以了 博客分类: ...

  8. SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法

    SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...

  9. log4net:保存自定义参数到数据库

    log4net:保存日志到数据库 自定义参数 新建一个类,继承于PatternLayoutConverter public class CustomerPatternConverter : Patte ...

  10. day6-2面向对象

    概述: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 注:Java和C#来 ...