wcf双工通信
一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着:
service层:
定义一个IDuplexHello服务接口
[ServiceContract(
Name = "DuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract), //设置回调服务类型
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
[OperationContract]
void Hello(string greeting);
}
实现DuplexHello.cs public class DuplexHello : IDuplexHello
{
public void Hello(string greeting)
{
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
Console.WriteLine("Waiting two seconds before returning call.");
Thread.Sleep(2000);
var callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
var response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
Console.WriteLine("Sending back: " + response);
callerProxy.Reply(response);
}
}
定义回调接口(回调服务函数没有必要添加servicecontract,因为人家是包含在IDuplexHello服务类型中的)
public interface IHelloCallbackContract
{
[OperationContract(IsOneWay = true)] //一定要记得添加operationcontract
void Reply(string responseToGreeting);
}
这里的回调接口实现类(HelloCallbackContract.cs)我是直接在service层实现的,当然在项目里面肯能大多数情况下都是在客服端实现,我这里也就为了方便啦
public class HelloCallbackContract : IHelloCallbackContract
{
public void Reply(string responseToGreeting)
{
Console.WriteLine(responseToGreeting);
}
}
将service寄宿到控制台应用程序中(用的都是代码实现):
private static void Main(string[] args)
{
using (var host = new ServiceHost(typeof (DuplexHello),
new Uri("http://localhost:991/DuplexHello"))) //添加基地址,在client就是这个地址,另外端口号不能鱼双工端口号相同
{
host.AddServiceEndpoint(typeof (IDuplexHello),
new NetTcpBinding(),
"net.tcp://localhost:999/DuplexHello");
var metadatbehavior =
host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metadatbehavior == null)
{
metadatbehavior = new ServiceMetadataBehavior()
{
HttpGetEnabled = true
};
host.Description.Behaviors.Add(metadatbehavior);
}
host.Opened += delegate
{
Console.WriteLine("服务已经启动");
};
host.Open();
Console.Read();
}
client层使用的也是一个控制台应用程序:
首先要运行宿主(找到host层资源文件夹bin->debug :host.exe)在更新wcf服务的时候也必须要先运行host.exe,否则会出现无法连接到服务器错误,
然后添加服务引用中地址栏输入http://localhost:991/DuplexHello 应用服务
再后应用之后客户端app.config自动生成如下代码:
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_DuplexHello" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:999/DuplexHello"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_DuplexHello"
contract="ServiceReference1.DuplexHello"
name="NetTcpBinding_DuplexHello">
<identity>
<userPrincipalName value="objectboy-PC\objectboy" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
客服端控制台应用程序中代码:
private static void Main(string[] args)
{
var hellocallbackcontract =
new HelloCallbackContract();
var instanceContext =
new InstanceContext(hellocallbackcontract); //实例化客服端类服务上下文
var duplexChannelFactory =
new DuplexChannelFactory<IDuplexHello>(instanceContext,
new NetTcpBinding()); //实例化双工通道,并绑定为tcp通信,注意不能用ChannelFactory,因为这是双工
var endpointaddress =
new EndpointAddress("net.tcp://localhost:999/DuplexHello");
var proxy =
duplexChannelFactory.CreateChannel(endpointaddress); //创建并将消息发送到指定的消息通道
using (proxy as IDisposable)
{
proxy.Hello("cccccccccccccccccc");
}
Console.Read();
}
客服端输出:
服务端输出:
wcf双工通信的更多相关文章
- Wcf 双工通信的应用
概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...
- WCF 双工通信
注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...
- WCF双工通信笔记
1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...
- WCF双工通信单工通信
1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...
- [转载]WCF实现双工通信
双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...
- 我的WCF之旅(3):在WCF中实现双工通信
双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...
- 在WCF中实现双工通信
双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...
- 利用WCF双工模式实现即时通讯
概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...
- [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端
原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...
随机推荐
- Android Weekly Notes Issue #321
Android Weekly Issue #321 August 5th, 2018. Android Weekly Issue #321 本期内容包括: 开源项目Plaid的改版; 使用Tensor ...
- Java常用类Date、Calendar、SimpleDateFormat详解
Date类 java.util 包提供了 Date 类来封装当前的日期和时间,Date 类提供两个构造函数来实例化 Date 对象 第一个构造函数使用当前日期和时间来初始化对象 Date( ) 第 ...
- 改变Ecplise项目窗口字体样式
Eclipse\plugins\org.eclipse.ui.themes_1.1.1.v20151026-1355\css e4-dark_win.css CTabFolder Tree, CTab ...
- Jmeter-JDBC Request
1. 新建一个测试计划 2. 新建一个线程组 3. 创建数据库连接 4.配置数据库连接 5.添加JDBC Request 6.添加监听器
- 点分治Day2 动态树分治
蒟蒻Ez3real冬令营爆炸之后滚回来更新blog... 我们看一道题 bzoj3924 ZJOI2015D1T1 幻想乡战略游戏 给一棵$n$个点的树$(n \leqslant 150000)$ 点 ...
- ACM学习历程—HDU5410 CRB and His Birthday(动态规划)
Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...
- ACM学习历程——POJ3321 Apple Tree(搜索,线段树)
Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will ...
- 【LeetCode】064. Minimum Path Sum
题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right w ...
- RabbitMQ的持久化机制
一.问题的引出 RabbitMQ的一大特色是消息的可靠性,那么它是如何保证消息可靠性的呢?——消息持久化.为了保证RabbitMQ在退出,服务重启或者crash等异常情况下,也不会丢失消息,我们可以将 ...
- bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...