zoukankan      html  css  js  c++  java
  • WCF初探-3:WCF消息交换模式之单向模式

    单向模式(One-Way Calls):

    • 在这种交换模式中,存在着如下的特征:
    • 只有客户端发起请求,服务端并不会对请求进行回复
    • 不能包含ref或者out类型的参数
    • 没有返回值,返回类型只能为void
    • 通过设置OperationContract的IsOneWay=True可以将满足要求的方法设置为这种消息交换模式

    接下来,我们通过实例来演示这种模式,首先新建一个WcfDemo1的解决方案,添加名称为Service的类库项目作为服务端,新建IOneWay接口和 OneWay类,由于单向模式中服务端并不会有返回操作,所以我们可以用线程时间来模拟客户端对服务端的调用情况。总个工程的结构如下:

     

     服务契约接口中的代码如下:

    using System.ServiceModel;
     
    namespace Service
    {
        [ServiceContract]
        public interface IOneWay
        {
            [OperationContract(IsOneWay=true)]
            void SayHello(string name);
        }
    }

    服务契约的实现代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace Service
    {
        public class OneWay:IOneWay
        {
            public void SayHello(string name)
            {
                System.Threading.Thread.Sleep(10000);
            }
        }
    }

    接下来我们将服务寄宿起来,Host中的配置文件代码如下:

    <?xmlversion="1.0"?>
    <configuration>
      <system.serviceModel>
        <services>
          <servicename="Service.OneWay"behaviorConfiguration="OneWayBehavior">
            <host>
              <baseAddresses>
                <addbaseAddress="http://127.0.0.1:1234/OneWay/"/>
              </baseAddresses>
            </host>
     
            <endpoint address=""binding="wsHttpBinding" contract="Service.IOneWay"/>
            <endpoint address="mex"binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
     
     
        <behaviors>
          <serviceBehaviors>
            <behaviorname="OneWayBehavior">
              <serviceMetadatahttpGetEnabled="True"/>
              <serviceDebugincludeExceptionDetailInFaults="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
     
    </configuration>

    Program.cs中的代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using Service;
     
    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost oneWayHost = newServiceHost(typeof(OneWay)))
                {
                    oneWayHost.Opened += delegate
                    {
                        Console.WriteLine("单向通讯服务已经启动,按任意键终止!");
                    };
     
                    oneWayHost.Open();
                    Console.Read();
                }
            }
        }
    }

    到此,我们完成了对服务的寄宿,启动Host.exe,在浏览器中输入http://127.0.0.1:1234/OneWay/我们可以看到寄宿成功的页面。在客户端添加服务引用:

     

    引用后在客户端程序添加以下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Client.OneWayServiceRef;
     
    namespace Client
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("****************单向通讯服务示例*******************");
                OneWayClient proxy = newOneWayClient();
                Console.WriteLine("方法调用前时间:"+ System.DateTime.Now);
                proxy.SayHello("WCF");
                Console.WriteLine("方法调用后时间:" + System.DateTime.Now);
                Console.Read();
            }
        }
    }

    生成后运行程序Client.exe,可以看到以下效果:

    我们发现前后两次的时间相同,虽然服务器方法的时间进程暂停了10s,但客户端的表现出的只是单向的,并没有等待服务器的时间,也就是服务器并没有像客户端发送响应的消息。

    以上是我们程序表现出来的结果。接下来,我们通过消息层面说明这个。启动vs自带的WCF客户端验证程序,在开始菜单中找到如下图所示的工具:

     

    点击启动该命令行,输入wcftestclient,回车,启动WCF客户端测试程序:

    在客户端测试程序中添加服务地址:

    点击对应的方法,点击调用按钮,最后我们发现服务器给出了一条提示:

      

    点击左下角的xml我们可以看到发送的具体消息:

    我们发现只有请求消息,没有返回的消息,说明服务器并没有对此作出任何反应。

    本文通过程序实例和消息层面说明消息交换模式中的单向模式,在接下来的文章中,我将继续演示消息交换中另外两只模式:请求/答复(Request/Reply) 、双工(Duplex)。

    作者:wangweimutou
    关注技能:ASP.NET、ASP.NET MVC、ASP.NET WEB API、WCF、MSSQL、ORACLE
    感谢您阅读本文,如果您觉得有所收获,麻烦点一下右边的【推荐】,您的支持是对我最大的鼓励!
    由于作者能力有限,本文只做学习交流使用,如有不正之处,欢迎指出
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留原文链接,否则保留追究法律责任的权利
  • 相关阅读:
    缺失值的常见填充方法
    多变量线性回归
    回归(补充)
    单变量线性回归
    监督学习和非监督学习
    Java学习-数组(1)
    如何发布一个npm包(基于vue)
    《麦肯锡教给我的写作武器》摘录
    自定义博客样式
    ubuntu 下配置elasticSearch
  • 原文地址:https://www.cnblogs.com/wangweimutou/p/4086590.html
Copyright © 2011-2022 走看看