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

1. OneWay模式,

    [ServiceContract]
public interface IOneWayService
{
[OperationContract(IsOneWay = true)]
void Add(double x, double y);
}

需要在OperationContract特性中显示的添加IsOneWay=true来标识这个操作是OneWay的,另外需要注意,此时的方法是不可以带返回值的。如果包含返回值,在启动Service后,可以看到下面截图所示的错误信息,

2. Request/Reponse模式,

当我们定义一个服务的操作时,该操作默认是请求回复模式的。不管该方法是否有返回值。可以通过Fiddler进行监控。

    [ServiceContract]
public interface IRequestReponseService
{
[OperationContract]
void Add(double x, double y);
}

通过Fidder发现,当没有返回值时,其实服务给了一个默认的回复消息,

3. Duplex模式

定义双工通信:

    [ServiceContract(CallbackContract = typeof(IDuplexCallbackService))]
public interface IDuplexService
{
[OperationContract(IsOneWay = true)]
void GetDuplexServiceResult(string username, string password);
}
    public interface IDuplexCallbackService
{
[OperationContract(IsOneWay = true)]
void ShowDuplexServiceResult(IEnumerable<Department> depts);
}

在定义服务契约时,同时指定回掉契约。

实现IDuplexService:

    public class DuplexService : IDuplexService
{
public void GetDuplexServiceResult(string username, string password)
{
if (string.IsNullOrWhiteSpace(username) ||
string.IsNullOrWhiteSpace(password))
{
return;
} if(username == "Yang-Fei" &&
password == "")
{
List<Department> depts = new List<Department>()
{
new Department() { Id = , Name="Development" },
new Department() { Id = , Name="Sales" },
new Department() { Id = , Name="Operation" },
}; IDuplexCallbackService callback =
OperationContext.Current.GetCallbackChannel<IDuplexCallbackService>(); callback.ShowDuplexServiceResult(depts);
}
}
}

我们可以使用netTcpBinding/wsDualHttpBinding来作为双工通信的binding。

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<services>
<service name="Services.DuplexService" behaviorConfiguration="DuplexServiceBehavior">
<endpoint address="" binding="netTcpBinding" contract="Services.IDuplexService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="netTcpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="net.tcp://10.12.65.145/DuplexService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DuplexServiceBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

需要在客户端实现回掉服务,例如:

    public class DuplexCallbackServiceClient : IDuplexServiceCallback
{
public void ShowDuplexServiceResult(Department[] depts)
{
foreach (Department dept in depts)
{
Console.WriteLine("Dept Id: {0} Dept Name: {1}", dept.Id, dept.Name);
}
}
}

对服务进行调用:

        static void Main(string[] args)
{
DuplexCallbackServiceClient client = new DuplexCallbackServiceClient(); InstanceContext context = new InstanceContext(client); using (DuplexServiceClient proxy = new DuplexServiceClient(context))
{
string username = "Yang-Fei"; string password = ""; proxy.GetDuplexServiceResult(username, password);
} Console.ReadKey();
}

运行结果:

代码点击这里下载,

感谢您的阅读。

WCF学习笔记之消息交换模式的更多相关文章

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

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

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

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

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

    单向模式(One-Way Calls): 在这种交换模式中,存在着如下的特征: 只有客户端发起请求,服务端并不会对请求进行回复 不能包含ref或者out类型的参数 没有返回值,返回类型只能为void ...

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

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

  5. WCF消息交换模式之请求-响应模式

    WCF的消息交换模式(MEP)有三种:请求/响应.单向模式和双工模式.WCF的默认MEP是请求/响应模式. 请求/响应模式操作签名代码如下,无需指定模式,默认就是. [OperationContrac ...

  6. WCF系列教程之WCF消息交换模式之单项模式

    1.使用WCF单项模式须知 (1).WCF服务端接受客户端的请求,但是不会对客户端进行回复 (2).使用单项模式的服务端接口,不能包含ref或者out类型的参数,至于为什么,请参考C# ref与out ...

  7. WCF学习之旅—HTTP双工模式(二十)

    WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...

  8. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

  9. WCF学习笔记之传输安全

    WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...

随机推荐

  1. 【架构】Google的大规模集群管理工具Borg

    参考资料: http://www.cnblogs.com/YaoDD/p/5374393.html http://www.cnblogs.com/YaoDD/p/5351589.html

  2. hnu11187

    AC自动机+DP #include <cstdio> #include <queue> #include <cstring> using namespace std ...

  3. Java计时器Timer和TimerTask用法

    package com.sy.game.test; import java.util.Timer; import java.util.TimerTask; public class TimeTask ...

  4. Struts2应用流程注解

    当Web容器收到请求(HttpServletReques   t)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器. 经过Other filters(SiteMe ...

  5. php中文转换编码函数

    $filename= $list->filename; // 获取文件名字 if(preg_match("/[\x80-\xff]/",$filename)){ // 如果是 ...

  6. JavaScript for循环里边异步操作问题。

    问题:(DRIVING.search是异步操作) for循环中做异步操作会导致aDistances数组里边的数据全部都是从A_SHOP_INFO数组中最后一条数据获取的值. var iIdx = 0; ...

  7. php命令行运行出现错误Call to undefined function curl_init()

    在windows命令行窗口下运行php命令,需要将php.exe所在的路径添加到Path环境变量,例如C:\wamp\bin\php\php5.4.3 启动Apache服务 在命令行中输入php te ...

  8. YAML-初识

    YAML简介 YAML-what? YAML Ain't Markup Language 和GNU一样,YAML是一个递归着说"不"的名字.不同的是,GNU对UNIX说不,YAML ...

  9. LTS学习

    下载 例子 安装部署zookeeper 运行根目录下的sh build.sh或build.cmd脚本 --> 会在dist目录下生成lts-{version}-bin文件夹(bin里有启动命令) ...

  10. wc(Word Count)

    .查看文件的字节数.字数.行数 wc test.txt --> 行数 单词数 字节数 文件名 .用来统计当前目录下的文件数(数量中包含当前目录) ls -l | wc -l -c 统计字节数. ...