WCF的回调使用实例代码说明
很多时候我们会遇到,信息及时推送通知的情况,例如:监控设备时及时推送状态、报警信息等,我们就可以用WCF的回调机制来实现,下面以一个监控设备名字为例,如果设备名字发生改变,服务器就马上推送消息给客户端:
(一、)服务器端
1、建一个控制台应用程序:CallbackContractWCF
2、创建ISendMessage接口
namespace CallbackContractWCF
{
[ServiceContract(CallbackContract = typeof(IMessageCallbackContract))]
public interface ISendMessage
{
///
/// 保存客户端回调的实例
///
[OperationContract]
void Subscribe();
}
}
3、创建用于推送消息回调的接口IMessageCallbackContract
namespace CallbackContractWCF
{
public interface IMessageCallbackContract
{
[OperationContract(IsOneWay = true)]
void ReportMes(string responseToGreeting);
}
}
4、创建实现接口ISendMessage的类SendMessage
namespace CallbackContractWCF
{
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)]
public class SendMessage:ISendMessage
{
private System.Timers.Timer _setValueTimer;
private IMessageCallbackContract callerProxy = null;
~SendMessage()
{
_setValueTimer.Stop();
Device.OnChange -= new Action(Student_OnChange);
}
public SendMessage()
{
Thread.Sleep();
_setValueTimer = new System.Timers.Timer();
_setValueTimer.AutoReset = true;
_setValueTimer.Elapsed += Timer_Elapsed;
_setValueTimer.Interval = ;
_setValueTimer.Start();
Device.OnChange += new Action(Student_OnChange);
}
//保存客户端回调的实例
public void Subscribe()
{
try
{
//获取当前调用的核心服务端实例的通道
callerProxy = OperationContext.Current.GetCallbackChannel();
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Random rand = new Random();
string name = "路由器"+rand.Next();
SetName(name);
}
private void SetName(string greeting)
{
if (greeting != Device.Name)
{
Device.Name = greeting;
Device.Change(greeting);
}
}
void Student_OnChange(string name)
{
try
{
Console.Write("只要名字与当前的不同就向客户端推送通知\r\n");
callerProxy.ReportMes(name);
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
}
//创建设备类
public static class Device
{
public static string Name { get; set; }
public static event Action OnChange;
public static void Change(string name)
{
if (OnChange != null)
{
OnChange.Invoke(name);
}
}
}
}
5、添加配置文件App.config
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="behavior1">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors> <bindings>
<netTcpBinding>
<binding name="BigBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00"
sendTimeout="00:10:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288000"
maxBufferSize="65536000" maxConnections="10" maxReceivedMessageSize="65536000"> <readerQuotas maxDepth="32000" maxStringContentLength="8192000"
maxArrayLength="16384000" maxBytesPerRead="4096000"
maxNameTableCharCount="16384000"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<security mode="None"/>
</binding>
<binding name="netTcpBinding_ISendMessage">
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings> <services>
<service name="CallbackContractWCF.SendMessage" behaviorConfiguration="behavior1">
<endpoint address="SendMessage" binding="netTcpBinding" bindingConfiguration="BigBinding"
contract="CallbackContractWCF.ISendMessage" name="netTcpBinding_ISendMessage" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8729/Design_Time_Addresses/CallbackContractWCF/SendMessage/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
(二、)客户端
1、创建控制台应用程序CallbackContractClient
2、启动服务器,添加服务引用
3、创建一个实现服务器端回调接口的类MessageCallback
namespace CallbackContractClient
{
[System.ServiceModel.CallbackBehavior(IncludeExceptionDetailInFaults = true, UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MessageCallback : ISendMessageCallback
{
public event Action OnReportMes; //实现服务端的回调
public void ReportMes(string responseMes)
{
if (OnReportMes != null)
{
OnReportMes.Invoke(responseMes);
}
}
}
}
4、在控制台主程序Program.cs中挂载服务
namespace CallbackContractClient
{
class Program
{
static void Main(string[] args)
{
MessageCallback callback=new MessageCallback ();
callback.OnReportMes+=new Action(callback_OnReportMes);
InstanceContext content = new InstanceContext(callback);
SendMessageClient clicent = new SendMessageClient(content);
clicent.Subscribe(); Console.Write("监控设备");
Console.ReadLine();
} public static void callback_OnReportMes(string res)
{
Console.Write("\r\n设备的名称为:" + res);
Console.ReadLine();
}
}
}
(三、)监测结果

WCF的回调使用实例代码说明的更多相关文章
- 阿里云OSS C#回调服务实例代码
先贴出客户端上传文件代码和毁掉函数的定义 需要的引用有:using Aliyun.OSS: 通过nuget包,获取aliyun.oss dll string url = "http:// ...
- 浅议Grpc传输机制和WCF中的回调机制的代码迁移
浅议Grpc传输机制和WCF中的回调机制的代码迁移 一.引子 如您所知,gRPC是目前比较常见的rpc框架,可以方便的作为服务与服务之间的通信基础设施,为构建微服务体系提供非常强有力的支持. 而基于. ...
- WCF会话(Session)与实例(Instance)管理
一.理解Session 1.Session的作用:保留Client和Service之间交互的状态,确保Client与Service之间交互唯一性(SessionId),即:多个Client同时访问Se ...
- asp.net中生成缩略图并添加版权实例代码
这篇文章介绍了asp.net中生成缩略图并添加版权实例代码,有需要的朋友可以参考一下 复制代码代码如下: //定义image类的对象 Drawing.Image image,newimage; //图 ...
- 模拟jQuery中的ready方法及实现按需加载css,js实例代码
这篇文章介绍了模拟jQuery中的ready方法及实现按需加载css,js实例代码,有需要的朋友可以参考一下 一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候 ...
- WCF通信简单学习实例
最近在学习WCF通信,自己简单做个实例分享一下,环境是VS2015,使用的项目都是WPF的项目,其实大家用Winform或者Web项目也可以,都可以用的. 一.服务器端 1.创建WCF服务 服务名为W ...
- jQuery Ajax方法调用 Asp.Net WebService、WebMethod 的详细实例代码
将以下html存为ws.aspx <%@ Page Language="C#" AutoEventWireup="true" %> <scri ...
- [WCF编程]8.服务实例的生命周期
一.服务实例的生命周期概览 我们已经直到,通过显式调用Close方法或等待默认的超时时间到来,都可以释放服务实例.但是,在会话连接里,经常需要按一定顺序调用方法. 二.分步操作 会话契约的操作有时隐含 ...
- C++11 变长模版和完美转发实例代码
C++11 变长模版和完美转发实例代码 #include <memory>#include <iostream>#include <vector>#include ...
随机推荐
- idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?
idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found? 很久没用idea搭新工程,最近自己想做个东西,冲心搭个web工程,jar包都 ...
- statistic学习笔记
1. 假设检验:就是对于符合一定前提条件的数据,先作一个假设H0,还有一个备择假设H1(一般是H0的反面,或者是H0不包含的情况),通过一定的计算公式,算出一个值(比如开方检验就是开方值),这个值的理 ...
- 深入Java虚拟机读书笔记第一章Java体系结构介绍
第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...
- js 遇到 Permission denied to access property ***
在开发过程 子页面刷新父页面时,中遇到的 Permission denied to access property *** 问题,处理如下: 这是一个跨域的问题,其实很简单 就是子页面所在域名不在父页 ...
- jQuery.noConflict()防冲突机制
许多JS库都非常喜欢使用$作为函数.变量.有时候,由于页面复杂的历史问题,或者为了实现特定的功能,我们不得不在页面中引入多个JS库.今儿个来学习学习jQuery库是怎么解决$冲突问题.(jQuery- ...
- Docker - 通过swarm 管理 docker service
创建一个 Docker service $ docker service create --replicas 1 --name myhelloworld alpine ping docker.com ...
- MCU助推居家移动医疗微型化
随着行动装置的快速普及,近几年行动医疗成为热门话题,市场成长迅速,也引发了不少新的商业模式.根据美通社一份市场调查报告指出,行动医疗市场在2018年将达到234.9亿美元的规模,2013至2018年期 ...
- 用C#实现网络爬虫(二)
上一篇<用C#实现网络爬虫(一)>我们实现了网络通信的部分,接下来继续讨论爬虫的实现 3. 保存页面文件 这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行 ...
- windows 下,用CreateWaitableTimer SetWaitableTimer 创建定时器(用轮询的办法保持高精度)
windows 下,用CreateWaitableTimer SetWaitableTimer 创建定时器可以有 100 纳秒也就是 1/10 微秒, 1/10000 毫秒的精度. 呵呵. SetWa ...
- 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)
不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...