WCF从零学习之设计和实现服务协定2
WCF从零学习之设计和实现服务协定(二)
在创建服务协定之前,有很多WCF术语,比如:
消息、服务、终结点
创建协定
类或接口都可以定义服务协定,建议使用接口,因为接口可以直接对服务协定建模
服务协定接口具有托管接口的所有优点:
服务协定接口可以扩展任何数量的其他服务协定接口。
一个类可以通过实现服务协定接口来实现任意数量的服务协定。
可以通过更改接口实现来修改服务协定的实现,而让服务协定保持不变。
可以通过实现旧接口和新接口来确定服务的版本。老客户端连接到原始版本,而新客户端则可以连接到比较新的版本
定义服务协定:
在类或接口上使用ServiceContractAttribute属性标记
定义服务操作:
在方法上使用OperationContractAttribute属性对其进行标记
参数和返回值
每个操作都有一个返回值和一个参数,即使它们为void。可以使用局部方法将对象的引用从一个对象传递到另一个对象,但与局部方法不同的是,服务操作不会传递对象的引用,而是传递对象的副本,也就是重新复制一份。
参数和返回值中使用的每个类型都必须是可序列化的。
默认情况下,基元类型是可序列化的
创建服务协定-服务操作的消息模式
- 请求/答复
[OperationContact]
string Hello(string str);
操作的结构是除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。
- 单向
如果WCF服务应用程序的客户端不必等待操作完成,并且不处理SOAP错误,则该操作可以指定单向消息模式。
若要为返回void的操作指定单向消息交换,请将IsOneWay属性设置为 true,默认为false,即请求/答复模式
[OperationContact(IsOneWay=true)]
void Hello(string str);
- 双工
双工模式的特点是,无论使用单向消息发送 还是请求/答复消息发送方式,服务和客户端均能独立的向对方发送消息(服务器端也能向客户端请求)。对于必须直接与客户端通信或消息交换的任意一方提供异步体验(包括类似于事件的行为)的服务来说,这种双向通信形式非常有用。
若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute属性的CallbackContract属性,如要实现双工模式,必须创建第二个接口,该接口包含在客户端调用的方法声明
[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(ICalculatorDuplexCallback))]//SessionMode会话的服务,实例的模式是唯一的,每个会话创建一个实例
public interface ICalculatorDuplex
{
[OperationContract(IsOneWay=true)]
void Clear();
}
public interface ICalculatorDuplexCallback
{
//客户端回调方法
[OperationContract(IsOneWay=true)]
void Equals(double result);
}
接下来进行双工模式的简单案例
WCF的WebConfig代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<bindings />
<client />
<services>
<service name="WcfService2.Service1" behaviorConfiguration="WcfServiceLibrary2.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:27322/Design_Time_Addresses/WcfServiceLibrary2/CalculatorService/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- Unless fully qualified, address is relative to base address supplied above -->
<endpoint address="" binding="wsDualHttpBinding" contract="WcfService2.IService1">
<!--
Upon deployment, the following identity element should be removed or replaced to reflect the
identity under which the deployed service runs. If removed, WCF will infer an appropriate identity
automatically.
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
<!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfServiceLibrary2.Service1Behavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

创建数据协定(DataContract)
为了获得最大可能的互操作微软平台和非微软平台,建议使用DataContractAttribute和DataMemberAttribute属性对自定义类型数据协定进行标记,以创建数据协定。如果不加上数据协定,数据类型是不会被序列化的,当然也可以使用其他序列化机制。标准ISerializable,SerializableAttribute和IXmlSerializable机制都可用于处理数据类型到基础SOAP消息的序列化,这些消息可将数据类型从一个应用程序带到另一个应用程序
使用out和ref参数
由于out和ref参数都表示将操作的值返回,所以操作协定的模式不能是单向模式,即IsOneWay=true
WCF从零学习之设计和实现服务协定2的更多相关文章
- WCF 设计和实现服务协定(01)
作者:jiankunking 出处:http://blog.csdn.net/jiankunking WCF 术语: • 消息 – 消息是一个独立的数据单元,它可能由几个部分组成,包含消息正文和消息头 ...
- WCF从零学习之WCF概述(一)
WCF从零学习之WCF概述(一) 一.WCF概述 我先了解了分布式应用程序开发,所谓分布式应用程序是指应用程序分布在不同计算机上,通过网络来共同完成一项任务.通常为服务器/客户端模式. 在WCF发布之 ...
- WCF学习心得------(二)设计和实现服务协定
设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...
- 【WCF系列】(二)设计和实现服务协定
设计和实现服务协定 WCF术语介绍 服务(Service):服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作. 终结点(EndPoint):终结点是用来发送或接收消息(或 ...
- WCF基础之设计和实现服务协定
本来前面还有一个章节“WCF概述”,这章都是些文字概述,就不“复制”了,直接从第二章开始. 当然学习WCF还是要些基础的.https://msdn.microsoft.com/zh-cn/hh1482 ...
- 零基础该如何学习UI设计
零基础学习该如何学习UI设计,没有基础该怎么开始学习呢?UI设计可以说是入行门槛很低的职业了,而且随着互联网的快速发展,UI设计的市场前景也越来也好,更多的人看到了这个高薪的行业也开始心动了,想要在 ...
- 从零学习Fluter(八):Flutter的四种运行模式--Debug、Release、Profile和test以及命名规范
从零学习Fluter(八):Flutter的四种运行模式--Debug.Release.Profile和test以及命名规范 好几天没有跟新我的这个系列文章,一是因为这两天我又在之前的基础上,重新认识 ...
- 学习UI设计书籍推荐
在学习UI设计的过程当中,特别想学或者零基础的人来说,需要学习到很多知识,比如软件 PS AI ,理论 色彩 排版 规范 UE 等,这些都是一名UI设计师需要学习的知识,而学习到这些知识,可以通过视频 ...
- 2、JavaScript 基础二 (从零学习JavaScript)
11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...
随机推荐
- 微软将彻底改变Windows发布方式
看到网上的新闻信息: 微软上任 CEO 史蒂夫·鲍尔默在职最后一段时间引入了更快的产品公布周期.不再向从前那样,每隔几年公布一次重大产品升级,而是功能一旦开发完成就会推送升级. 显然,现任 CEO 纳 ...
- ASP.Net MVC 数据处理
ASP.Net MVC 数据处理 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. ...
- Canvas旋转图片--保持相同大小的算法
function drawImg(angle) { canvas.width = canvas.width; var distance = size / 2 * Math.sqrt(2) ...
- hdu 2066 一个人的旅行 最短路径
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- CSharp设计模式读书笔记(20):观察者模式(学习难度:★★★☆☆,使用频率:★★★★★)
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式的别名包括发布-订阅(Publish/ ...
- UVALive 6472 Powers of Pascal
标题手段: 他给了一个无限Pascal阵,定义了powers,然后询问power为P的pascal矩阵里面的第R行C列的元素是多少. 最開始读错题意了...然后 就成了一个神得不得了的题了.后来请教的 ...
- Apache & WebDav 配置(一)
(一)简单Apache服务器的搭建!用于文件de上传.下载.修改.删除! ---------- - Apache 1. 使用最广的 Web 服务器.支持各种脚本(PHP)的执行 2. Mac自带,只需 ...
- Swift语言指南(六)--可选值
原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值 注: 在 C 和 Objective ...
- 山寨游戏的未来Apple App Store
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXF1c2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- Highcharts图表导出为pdf的JavaWeb实践
写给读者的话^_^: 众所周知,基于Highcharts插件生成的svg图片组(注意这里鄙人指的组是若干图有序组合,并非一张图片,具有业务意义)导出为PDF文档是有难度滴.鄙人也曾“异想天开”用前端技 ...