zoukankan      html  css  js  c++  java
  • 初学WCF之消息模式——双工模式


      昨天终于下定决心计划这个月要把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<IB>();
            }
            public void Clear()
            {
                //服务端调用客户端的E方法
                ib.E(result + 9);
            }
        }
    }
    复制代码

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

      本来是这样的:

    复制代码
     <service name="WcfServiceLibrary4.Service1" behaviorConfiguration="WcfServiceLibrary4.Service1Behavior">
            <host>
              <baseAddresses>
                <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary4/Service1/" />
              </baseAddresses>
            </host>
            <!-- Service Endpoints -->
            <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
            <endpoint address ="" binding="wsHttpBinding" contract="WcfServiceLibrary4.IService1">
    复制代码

      修改后:

    复制代码
    <service name="WcfServiceLibrary4.A" behaviorConfiguration="WcfServiceLibrary4.Service1Behavior">
            <host>
              <baseAddresses>
                <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary4/A/" />
              </baseAddresses>
            </host>
            <!-- Service Endpoints -->
            <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
            <endpoint address ="" binding="wsDualHttpBinding" contract="WcfServiceLibrary3.IA">
    复制代码

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

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

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

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

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

    复制代码
    //请记得添加以下两个命名空间
    using System.ServiceModel;
    using ConsoleApplication1.ServiceReference1;
    
    namespace ConsoleApplication1
    {
        /// <summary>
        /// 我今天主要是在B继承一个接口这个花了很长的时间,我总以为能找到服务端里的IB接口,谁知道服务端的接口IB是IACallback的形式出现在客户端
        /// </summary>
        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();
            }
        }
    }
    复制代码

      Demo下载

  • 相关阅读:
    POJ 1003 解题报告
    POJ 1004 解题报告
    POJ-1002 解题报告
    vi--文本编辑常用快捷键之光标移动
    常用图表工具
    September 05th 2017 Week 36th Tuesday
    September 04th 2017 Week 36th Monday
    September 03rd 2017 Week 36th Sunday
    September 02nd 2017 Week 35th Saturday
    September 01st 2017 Week 35th Friday
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2584847.html
Copyright © 2011-2022 走看看