5 wcf双工
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双工的更多相关文章
- 利用WCF双工模式实现即时通讯
概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...
- [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端
原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...
- WCF双工学习笔记
WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到. WCF双工支持两种bind,一是nettcp.另一个是wsDualHttp,这里 ...
- WCF双工通讯以及客户端间的间接通讯
由于学习计划安排不当,对WCF的认知一直停滞不前,最近工作上又用回了WCF,重拾一下,看到蒋老师介绍双工通讯的博文,实践一下,积累一下.原想着WCF的双工通讯就是原本的客户端能调用服务端的方法之余,服 ...
- Wcf 双工通信的应用
概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...
- WCF 双工模式
WCF之消息模式分为:1.请求/答复模式2.单向模式3.双工模式 其中,请求/答复模式,在博文: WCF 入门教程一(动手新建第一个WCF程序并部署) WCF 入门教程二 中进行了详细介绍,此处将主要 ...
- WCF 双工通信
注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...
- WCF双工通信单工通信
1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...
- WCF双工通信笔记
1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...
- wcf双工通信
一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着: service层: 定义一个IDuplexHello服务接口 [ServiceContract( ...
随机推荐
- 9.1 Binder系统_C程序示例_框架分析和编写程序
IPC : Inter-Process Communication, 进程间通信 A进程把数据原原本本的发给B,这就是IPC RPC : Remote Procedure Call, 远程过程调用 A ...
- The behavior of App killed or restored by Android System or by users
What's the behavior of App killed or restored by Android System or by users? First, user kills the a ...
- 对延时敏感的应用是否应该使用Docker?
在High Scalability上看到一篇文章 How Does The Use of Docker Effect Latency? .文章回答了一个问题 I keep hearing about ...
- Java文档上传问题设计
近期公司让做一个文档上传的功能,功能描写叙述大概是这样子滴 书籍名称.书籍定价.书籍封面图片(须要上传).文档内容 (须要上传) .还有其它相关的描写叙述信息. 我的设计 表 A 包括以上字段 , ...
- Hbase常见异常 分类: B7_HBASE 2015-02-02 16:16 412人阅读 评论(0) 收藏
1. HBase is able to connect to ZooKeeper but the connection closes immediately hbase(main):001:0> ...
- php javascript的ajax
先说基础一点的get类型的ajax function loadXMLDoc() { var xmlhttp;//首先判断浏览器是否支持xmlhttprequest,因为ie56不是这个对象,是acti ...
- Opencv中integral计算积分图
Paul Viola和Michael Jones在2001年首次将积分图应用在图像特征提取上,在他们的论文"Rapid Object Detection using a Boosted Ca ...
- 【u208】修复公路
Time Limit: 1 second Memory Limit: 128 MB [问题描述] A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数 ...
- [CortexM0--stm32f0308]Option Byte
问题描写叙述 option byte,算是IC中比較简单的功能,就是用户能够写入数据,对IC的某些功能进行配置.而IC在reset时,会载入当中的内容,进行推断,从而使用户的配置生效. option ...
- [React] Use React Context to Manage Application State Through Routes
We’ll create a Router component that will wrap our application and manage all URL related state. We’ ...