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 ...
随机推荐
- html5 的百度地图连接
在一些网站上,我们经常会看到一些地址会有一个图标的形式展现,当你点击的时候就会加载一个你点击区域的地图出来,很神奇的一个功能,在之前是没有这样功能的,都是直接写上地址,你要去的话自己找去吧,现在有了这 ...
- RB1001: IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常
标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...
- phpcms首页调用会员头像及金钱、积分等信息,并按照积分点数排列
<div class="box"> <h5>最新会员</h5> <div class="col-auto">&l ...
- JS笔记2 --定义对象
16.javascript中定义对象的几种方式(javascript中没有类的概念,只有对象): 1)基于已有对象扩充其属性和方法: var object = new Object(); object ...
- postgres常用类型
数值类型 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字节 常用的整数 -2147483648 到 +2147483647 ...
- python numpy 使用笔记 矩阵操作
(原创文章转载请标注来源) 在学习机器学习的过程中经常会用到矩阵,那么使用numpy扩展包将是不二的选择 建议在平Python中用多维数组(array)代替矩阵(matrix) 入门请考 http:/ ...
- Solr4.8.0源码分析(13)之LuceneCore的索引修复
Solr4.8.0源码分析(13)之LuceneCore的索引修复 题记:今天在公司研究elasticsearch,突然看到一篇博客说elasticsearch具有索引修复功能,顿感好奇,于是点进去看 ...
- JMS 问题java.lang.NoClassDefFoundError: weblogic/security/acl/UserInfo
run: Exception in thread "main" java.lang.NoClassDefFoundError: weblogic/security/acl/User ...
- [Android] 获取音频输出getOutput
每创建一个AudioTrack,代表需要新增一个输出实例,即需要根据音频流的的stream type,音频流的音轨数量,采样率,位宽等数据来重新构建buffer,而且输出的设备也可能会有变化,由于An ...
- 【HDOJ】5017 Ellipsoid
简单地模拟退火. /* 5017 */ #include <cstdio> #include <cstring> #include <cstdlib> #inclu ...