博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学WCF之消息模式3——双工模式
阅读量:4881 次
发布时间:2019-06-11

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

  昨天终于下定决心计划这个月要把WCF学完,之所以安排一个月的时间,我不要只是学些表面的东西,我要比较深入的去学习下它。如果只学些表面的东西,我想一般的人花个一周的时间就够了。最近一段时间想要学的东西感觉太多了,想学习下Silverlight、WPF、WCF、MVC等,但总感觉好像很忙似的,我也不知道我在忙些什么,就这样稀里糊涂的一天就过去,一事无成。昨天晚上终于想起了5月份写的一个计划规则,还是按照这个计划规则去写每天的计划、日记、月计划。这样每天做了些什么,每天应该做些什么,目标很明确,再也不会像以前那样,想学Silverlight、WPF、WCF、MVC等,一会儿想看下Silverlight,一会儿想看下WPF,一会儿想等找到份工作再去学习它们。像这样下去这些东西的皮毛都没有学到,而且这样又把自己累得要死。 人们总喜欢说计划赶不变化,我觉得这没有什么道理,我觉得只要你计划的合理的话,这个计划肯定不会难产的。这是我最近的状况总结。费话说的有点多了,还大家见谅。。。呵呵!下面主要是和大家分享下我今天所学的双工模式。

  这个其实不难,但让我花比较长的时间,咱天生有点愚笨,没办法,所以特意记录下,以免下次又忘记了。

  双工模式的特点是:无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。对于必须直接与客户端通信或向消息交换的任意一方提供异步体验(包括类似于事件的行为)的服务来说,这种双向通信形式非常有用。

  由于存在与客户端通信的附加机制,双工模式比请求/答复或单向模式要略为复杂。

  若要设计为双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute属性(attribute)的CallbackContract属性(protery)。

  若要实现双工模式,您必须创建第二个接口,该接口包含在客户端调用的方法声明。(以上四段话摘自:MSDN Webcasts 徐长龙讲的《跟我一起从零开始学WCF系列课程》的第二章,希望大家能充分理解这四段的意思,我今花了比较长的时间来学这个双工模式,就是因为没有注意看这四段话,没有理解好。)。

  下面我们就来创建一个WCF项目吧!

  点击确定,就这样创建了一个WCF项目了。简单吧。。。

目录如下:

你把IService1.cs和Serivce1.cs删除了也可以,没事的,咱就懒得删除了。咱把IService1.cs和Serivce1.cs里面的内容全部删除了。以下是IService1.cs文件里的内容:

namespace WcfServiceLibrary4{    [ServiceContract(Namespace = "http://Microsoft.ServiceMode.Samples", SessionMode = SessionMode.Required, CallbackContract = typeof(IB))]    //定义一个服务接口    public interface IA    {        [OperationContract(IsOneWay=true)]        void Clear();    }    //这个是服务端调用客户端里方法的一个接口,在客户端里写一个类继承这个接口时,你是找到不IB这个接口的名字的,上面的CallbackContract = typeof(IB)这句话指定的回调的接口是IB,但它是以IACallback的形式出现的    public interface IB    {        [OperationContract(IsOneWay=true)]        void E(double e);    }}

以下是Serivce1.cs里面的代码:

namespace WcfServiceLibrary4{    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]    public class A : IA    {        double result;        //声明一个IB接口的对象        IB ib = null;        //A类的构造方法        public A()        {            result = 0.0D;            //实例化一个IB            ib = OperationContext.Current.GetCallbackChannel
(); } public void Clear() { //服务端调用客户端的E方法 ib.E(result + 9); } }}

  然后把App.config配置文件修改下就可以了。

  本来是这样的:

  修改后:

  一定要把wsHttpBinding改成wsDualHttpBinding,请大家仔细对照下。

  下面实现客户端的调用吧,不过端还得实现服务端IB的接口。

  我在这个项目里添加了个命令项目,你添加个WebFrom项目或者Windows项目也可以的。

  哦,差点忘了应该先生成下服务,然后再在命令项目里右击“引用”选择“添加服务引用",不要点错了哦。

  然后我们开始在Program.cs里添加如下代码:

//请记得添加以下两个命名空间using System.ServiceModel;using ConsoleApplication1.ServiceReference1;namespace ConsoleApplication1{    ///     /// 我今天主要是在B继承一个接口这个花了很长的时间,我总以为能找到服务端里的IB接口,谁知道服务端的接口IB是IACallback的形式出现在客户端    ///     public class B:IACallback    {        #region IACallback 成员     //实现了IB接口的E方法        public void E(double e1)        {            Console.WriteLine("E:" + e1);        }#endregion    }    class Program    {        static void Main(string[] args)        {            InstanceContext instanceContext = new InstanceContext(new B());            ServiceReference1.AClient client = new AClient(instanceContext);            client.Clear();            Console.ReadKey();        }    }}

  

  欢迎大家拍砖,咱家正在建房......,如果你是烧砖厂的,欢迎你一车砖一车砖的拍,咱高兴的很呐,时间也不早了,明天早上还要去面试,该洗洗睡了,晚安各位基友。。。

转载于:https://www.cnblogs.com/koeltp/archive/2012/07/09/2583807.html

你可能感兴趣的文章
C程序模拟实现银行家算法
查看>>
IDEA Rest Client使用
查看>>
洛谷1423 小玉在游泳
查看>>
java中split()特殊符号"." "|" "*" "\" "]"
查看>>
Java字节流与字符流的区别
查看>>
Reactive Extensions介绍
查看>>
【Language】Popular Javascript Convention on Github
查看>>
oracle spatial 创建空间字段索引 创建字段索引 完善SQL语句实例二
查看>>
[15] 星星(Star)图形的生成算法
查看>>
三体运动的程序模拟
查看>>
敏捷开发综述
查看>>
04: 层级评论
查看>>
CentOS Nginx MySQL PHP 环境搭建 (Version 1.0)
查看>>
ASP.NET图片上传,加水印文字和水印图片!
查看>>
初学java-基础
查看>>
node-sass 报错的解决方法
查看>>
Get IPv4 Address 2.0
查看>>
Let's-Bug修复日志
查看>>
Java中String类(字符串操作)的10个常见问题和解决方法
查看>>
电子书下载:Microsoft Windows Workflow Foundation 4.0 Cookbook
查看>>