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. client产生CLOSE_WAIT状态的解决方式

    现象 生产环境和測试环境都发现有个外围应用通过搜索服务调用搜索引擎时.偶尔会出现大量的訪问超时的问题,通过例如以下方式进行分析排查: l 首先是拿到搜索服务的JavaCore.发现其堵在HttpCli ...

  2. 使用vue-cil搭建项目

    原文: 简书原文:https://www.jianshu.com/p/1af9b72cf86e 大纲 1.安装NodeJs 2.安装vue-cli 3.创建项目 4.启动项目 5.打包项目 6.项目实 ...

  3. poj1564 Sum It Up (zoj 1711 hdu 1258) DFS

    POJhttp://poj.org/problem?id=1564 ZOJhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=711 ...

  4. [Node] Define MongoDB Model with Mongoose

    const mongoose = require('mongoose'); mongoose.Promise = global.Promise; // url friendly const slug ...

  5. 字典(dictionary)的设计

    1. 简单接口 struct Dict{ bool has(const string& key); void insert(const string& key, const strin ...

  6. php 下载服务器上存在的文件 到本地

    Header("Location: http://www.weiyunyi.com/Public/youbu_score_template.xls");

  7. angular风格指南

    原文 https://www.jianshu.com/p/1a0a0a74769a 大纲 综述 1.单一职责 2.命名 3.LIFT-D应用程序结构 4.组件 综述 以下说的准则是根据angular官 ...

  8. win-server下定时备份oracle数据库实现方法

    1.在e盘建立一个“oracle_backup”的文件夹,文件夹下再建两个文件夹分别为:“new”,“old”,然后在oracle_backup文件夹中新建一个bat文件,取名“expdb.bat”, ...

  9. Centos6.5 VNC 配置

    VNC 配置 本教程配置说明 目的:实现Window下VNC登陆Linux服务器 本机是在root用户下操作完毕 两台主机已实现基本网络配置,且相互ping通 1. 检查图形界面 确保服务器端须要执行 ...

  10. Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡...)

    众所周知,想要让ImageView旋转的话,可以用setRotation()让其围绕中心点旋转,但这个旋转是不带动画的,也就是旋转屏幕时图片噌的一下就转过去了,看不到旋转的过程,此UI体验不大好,为此 ...