首页 > 代码库 > WCF初探-3:WCF消息交换模式之单向模式

WCF初探-3:WCF消息交换模式之单向模式

1.单向模式(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)。

 

WCF初探-3:WCF消息交换模式之单向模式