单向模式(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();
}
}
}

接下来我们将服务寄宿起来,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消息交换模式之单向模式的更多相关文章

  1. WCF学习笔记之消息交换模式

    在WCF通信中,有三种消息交换模式,OneWay(单向模式), Request/Reponse(请求回复模式), Duplex(双工通信模式)这三种通信方式.下面对这三种消息交换模式进行讲解. 1. ...

  2. WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)

    1.使用WCF请求与答复模式须知 (1).客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void (2).相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后 ...

  3. WCF学习之旅—请求与答复模式和单向模式(十九)

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答 ...

  4. WCF初探-4:WCF消息交换模式之请求与答复模式

    请求与答复模式( Request/Reply) 这种交换模式是使用最多的一中,它有如下特征: 调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型 相比Duplex来讲,这种模式强调的 ...

  5. WCF消息交换模式之双工通讯(Duplex)

    WCF消息交换模式之双工通讯(Duplex) 双工通讯Duplex具有以下特点: 1它可以在处理完请求之后,通过请求客户端中的回调进行响应操作 2.消息交换过程中,服务端和客户端角色会发生调换 3.服 ...

  6. WCF把书读薄(2)——消息交换、服务实例、会话与并发

    上一篇:WCF把书读薄(1)——终结点与服务寄宿 八.消息交换模式 WCF服务的实现是基于消息交换的,消息交换模式一共有三种:请求回复模式.单向模式与双工模式. 请求回复模式很好理解,比如int Ad ...

  7. WCF初探文章列表

    WCF初探-1:认识WCF WCF初探-6:WCF服务配置 WCF初探-2:手动实现WCF程序 WCF初探-7:WCF服务配置工具使用 WCF初探-3:WCF消息交换模式之单向模式 WCF初探-8:W ...

  8. WCF初探-15:WCF操作协定

    前言: 在前面的文章中,我们定义服务协定时,在它的操作方法上都会加上OperationContract特性,此特性属于OperationContractAttribute 类,将OperationCo ...

  9. WCF入门四[WCF的通信模式]

    一.概述 WCF的通信模式有三种:请求/响应模式.单向模式和双工通信. 二.请求/响应模式 请求/响应模式就是WCF的默认模式,前面几篇随笔中的示例都是这种模式,当客户端发送请求后(非异步状态下),即 ...

随机推荐

  1. Leetcode: Split Array Largest Sum

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  2. JS---------IIFE(Imdiately Invoked Function Expression 立即执行的函数表达式)

    +function($){}(jQuery); 今天看到js代码里面有这个格式的代码,不知道啥意思,就去查了一下,我也是js小白.首先前面的+号,这个不是固定非要写+号,只要写一级运算符都可以.目的是 ...

  3. C# 类的属性

    属性是一个方法或者一对方法.客户端看来是一个字段. 定义属性 public int StudyHours{ //啥不写,默认有get;set; 和后备字段studyHours是private的 get ...

  4. LeetCode: Nim Game

    这题其实不太好想,用到了博弈论 1,2,3 能赢 4 输 5,6,7 赢 8 输 9,10,11 赢 12 输 那么结论就是4的倍数就是输,其他情况就能赢. 为什么会是这样呢?很好解释,根源就在4会输 ...

  5. GDB调试多线程

    先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. th ...

  6. [CrunchBang]tint2默认设置

    #--------------------------------------------- # TINT2 CONFIG FILE #-------------------------------- ...

  7. jQuery : eq() vs get()

    .get(index) and .eq(index) both return a single "element" from a jQuery object array, but ...

  8. SourceTree 免登录跳过初始设置

    SourceTree 安装之后需要使用账号登陆以授权,以前是可以不登陆的,但是现在是强制登陆. 虽然是免费授权,但是碰上不可抗力因素,登陆不是很方便,这里记录一下跳过这个初始化的步骤. 安装之后,转到 ...

  9. Testng使用方法示例

    TestNG TestNG是一个测试框架,灵感来自JUnit和NUnit.但引入了下面这些新的功能,使它更强大和更容易使用. 注解: 可在任意大的线程池运行您的测试(所有方法在它们自己的线程内,一个线 ...

  10. linux centos 6.5 运行MySQL Workbench 6.0找不到 libmysqlclient.so.16和libmysqlclient_r.so.16

    找到已安装mysql/lib目录下有类似文件: -rw-r--r-- root root 12月 : libmysqlclient.a lrwxrwxrwx root root 12月 : libmy ...