1 创建两个项目

Wcf_WsDual_Service   Wcf_WsDual_Client

2 Wcf_WsDual_Service   项目中创建 LoginService.cs 的wcf文件

using System.ServiceModel;

namespace Wcf_WsDual_Service
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ILogin”。
//注意此处构造函数里面的回调
[ServiceContract(CallbackContract =typeof(ICallBack))]
public interface ILoginService
{
[OperationContract]
void Login(string username);
}
//注意此处添加了回调接口
[ServiceContract]
public interface ICallBack
{
[OperationContract]
void Notify(string msg);
}
}

ILoginService

using System;
using System.Collections.Generic;
using System.ServiceModel; namespace Wcf_WsDual_Service
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Login”。
public class LoginService : ILoginService
{
//存储所有请求了这个服务的客户端管道
public static Dictionary<string, ICallBack> channelDic = new Dictionary<string, ICallBack>();
void ILoginService.Login(string username)
{
//获得请求带ICallBack的endpoint的channel
var callback = OperationContext.Current.GetCallbackChannel<ICallBack>();
channelDic[username] = callback;
Console.WriteLine($"用户{username}已经登录");
}
//服务端动作
public static void OperateAction()
{
while (true)
{
string msg = Console.ReadLine();
if (!string.IsNullOrEmpty(msg))
{
//遍历客户端管道 向这些管道发送消息
foreach (var item in channelDic)
{
item.Value.Notify(msg);
} } }
}
}
}

LoginService

3 修改服务配置文件

a 将协议改成双工  b将对应双工的安全设置成无安全

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.serviceModel> <!--双工默认有安全验证 这里取消安全-->
<bindings>
<wsDualHttpBinding>
<binding name="MyDual">
<security mode="None"></security>
</binding>
</wsDualHttpBinding>
</bindings> <behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Wcf_WsDual_Service.LoginService">
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="MyDual"
contract="Wcf_WsDual_Service.ILoginService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8988/Design_Time_Addresses/Wcf_WsDual_Service/Login/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

appConfig

4.在服务端main方法中启动服务,并异步启动线程用以向客户端发送消息

using System;
using System.ServiceModel;
using System.Threading.Tasks; namespace Wcf_WsDual_Service
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(LoginService));
host.Open();
Console.WriteLine("服务已经启动");
Task.Run(() =>
{
LoginService.OperateAction();
}); System.Threading.Thread.Sleep(int.MaxValue);
} } }

Program

5.客户端引用服务引用

6.客户端创建一个LoginCallBack类实现服务端定义的iLoginCallBack接口

  public class LoginCallBack : ILoginServiceCallback
{
public void Notify(string msg)
{
Console.WriteLine(msg);
}
}

LoginCallBack

7.客户端main方法创建一个服务实例,并想服务发送请求,在服务端这个请求会记录下这个请求对应的客户端的信息

 class Program
{
static void Main(string[] args)
{
var instanceContext = new InstanceContext(new LoginCallBack());
LoginServiceClient client = new LoginServiceClient(instanceContext);
client.Login("winner");
Console.ReadKey();
}
}

客户端Program

8.这样启动服务之后,再启动客户端,客户端会给服务端发送一个请求,服务端会记录下客户端的endpoint等信息创建一个针对客户端的管道,服务端就可以利用这个管道向服务端发送消息了

5 wcf双工的更多相关文章

  1. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

  2. [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端

    原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...

  3. WCF双工学习笔记

    WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到. WCF双工支持两种bind,一是nettcp.另一个是wsDualHttp,这里 ...

  4. WCF双工通讯以及客户端间的间接通讯

    由于学习计划安排不当,对WCF的认知一直停滞不前,最近工作上又用回了WCF,重拾一下,看到蒋老师介绍双工通讯的博文,实践一下,积累一下.原想着WCF的双工通讯就是原本的客户端能调用服务端的方法之余,服 ...

  5. Wcf 双工通信的应用

    概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...

  6. WCF 双工模式

    WCF之消息模式分为:1.请求/答复模式2.单向模式3.双工模式 其中,请求/答复模式,在博文: WCF 入门教程一(动手新建第一个WCF程序并部署) WCF 入门教程二 中进行了详细介绍,此处将主要 ...

  7. WCF 双工通信

    注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...

  8. WCF双工通信单工通信

    1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...

  9. WCF双工通信笔记

    1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...

  10. wcf双工通信

    一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着: service层: 定义一个IDuplexHello服务接口 [ServiceContract( ...

随机推荐

  1. POSIX 多线程编程及理解

    最近开发基于ZYNQ的嵌入式linux程序,涉及到多线程使用,将一些内容整理如下: POSIX多线程编程最为基础和重要的可以分为两部分: 线程操作-Thread Management 线程同步-Syn ...

  2. [Angular2 Router] Auxiliary Routes bit by bit

    Article Github Auxiliary Routes is is little bit hard to understand. Here is demo, link You can see ...

  3. 【a903】石子归并

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相 ...

  4. php 文件夹是否存在,不存在就创建

    $lujing = "./nihao/wohao"; if(!is_dir($liujing)){ mkdir(iconv("UTF-8", "GBK ...

  5. CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解

      原文地址:https://blog.csdn.net/z13615480737/article/details/78906598  CentOS7默认数据库是mariadb, 但是 好多用的都是m ...

  6. 【TP SRM 703 div2 250】AlternatingString

    Problem Statement A string of zeros and ones is called an alternating string if no two adjacent char ...

  7. 转载:使用bat命令来快速安装和卸载Service服务

    一般我们在编写完Service服务程序后,都是通过cmd命令提示窗口来安装或卸载服务,但频繁的在cmd窗口中去“拼”文件的路径着实让人“不能忍”.所以,我们需要一钟“更快捷”的方式来进行安装或者卸载操 ...

  8. HTML5 canvas 指针时钟

    <!doctype html> <html> <head></head> <body> <canvas id="> 您 ...

  9. docker nginx实现一个主机部署多个站点

    原文:docker nginx实现一个主机部署多个站点 在某站租赁的虚拟机快到期了,续费得花200多,想到在阿里云新买的服务器,不如把这个也转移过去.域名我就用真实的吧,大家别黑我网站就好了,谢谢各位 ...

  10. Centos6.5 网络配置

    网络配置 本教程配置说明 以下为本教程安装时的配置,用户依据实际情况进行调整 * 在root用户权限下安装下完毕 * IP地址设置为 10.10.108.160 * 本机DNS设置为 8.8.8.8 ...