博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Art of WCF 2,设计与实现服务协定
阅读量:5286 次
发布时间:2019-06-14

本文共 1909 字,大约阅读时间需要 6 分钟。

服务协定(ServiceContract)

首先明白几个术语:

消息:独立的数据单元,包括正文和消息头。

终结点:用于发送或接收消息的构造。一个WCF服务作为一个终结点向外界公开。
服务:服务是一个公开了一个或多个终结点的构造,包括一个或多个服务操作。

创建服务协定:

可以用类和接口来定义,不过推荐使用接口来建模,这是因为接口定义的服务协定可以方便的进行其它服务协定的扩展,也方便实现类实现其它服务协定,便于修改和版本更新。

定义服务协定:使用ServiceContractAttribute属性标记。

定义服务操作:使用OperationContractAttribute属性标记。
参数与返回值:每个操作都有一个返回值与一个参数,即使是void。它们在Client和Server之间传递的是对象的副本而不是对象的引用,且必须是可序列化的。

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] // 服务合约 public interface ICalculator {   [OperationContract] // 操作合约  double Add(double n1, double n2);   [OperationContract] // 操作合约   double Subtract(double n1, double n2);   [OperationContract] // 操作合约   double Multiply(double n1, double n2);   [OperationContract] // 操作合约   double Divide(double n1, double n2); }

服务操作的三种消息模式:

1,请求/答复模式(默认模式),支持传入操作和返回操作。如果客户端采用同步调用模式的话,将梗塞直到服务返回。

[OperationContract]string GetData(string para);

2,单向模式,客户端不等待操作的完成也不处理SOAP错误信息。一般用于返回void的操作指定为单向模式。

[OperationContract(IsOneWay=true)]Hello(string para);

3,双工模式,当必须直接与对方通讯时,可以设计回调协定,实现双工模式,这时双方都可以独立的向对方发送信息。

[ServiceContract(NameSpace=”http:SessionMode=SessionMode.Required,CallbackContract=typeof(ICalculatorDuplexCallback))]//回调协定必须是事先指定类型的对象public interface ICalculatorDuplex{    [OperationContract(IsOneWay=true)]    Clear();    [OperationContract(IsOneWay=true)]    Add(int para);}public interface ICalculatorDuplexCallback{    [OperationContract(IsOneWay=true)]    void Equals(double result);    [OperationContract(IsOneWay=true)]    void Equaltion(string eqn);}

实现接口服务协定时的方法:

ICalculatorDuplexCallback callback = OperationContext.Current.GetCallbackChannel
();

这样就获得了对方回调时的对象的副本,就可以方便的通过callback来调用该接口内的方法了,注意,这里面方面的实现是在对方而不是本地。

当客户端调用服务端的Add方法时,可以在Add方法中回调客户端实现的ICalculatorDuplexCallback子类中的相关方法,从而实现双方都可以调用对方的类与方法。

Out与Ref参数:这两种参数不可用于单向模式。使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

 

<完>

转载于:https://www.cnblogs.com/luckeryin/archive/2012/09/25/2701806.html

你可能感兴趣的文章
C# Stream 和 byte[] 之间的转换
查看>>
OMG: daily scrum nine
查看>>
redis与spring结合错误情况
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
字符串方法title()、istitle()
查看>>
yield语句
查看>>
查看linux系统中占用cpu最高的语句
查看>>
[洛谷P1738]洛谷的文件夹
查看>>
ubuntu server设置时区和更新时间
查看>>
【京东咚咚架构演进】-- 好文收藏
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>
Bootstrap--响应式导航条布局
查看>>
Learning Python 009 dict(字典)和 set
查看>>
JavaScript中随着鼠标拖拽而移动的块
查看>>
HDU 1021 一道水题
查看>>
The operation couldn’t be completed. (LaunchServicesError error 0.)
查看>>
php每天一题:strlen()与mb_strlen()的作用分别是什么
查看>>
工作中收集JSCRIPT代码之(下拉框篇)
查看>>
《转载》POI导出excel日期格式
查看>>