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 ...
随机推荐
- caption标签,为表格添加标题和摘要
表格还是需要添加一些标签进行优化,可以添加标题和摘要.代码如下: 摘要 摘要的内容是不会在浏览器中显示出来的.它的作用是增加表格的可读性(语义化),使搜索引擎更好的读懂表格内容,还可以使屏幕阅读器更好 ...
- C#设置IP地址,启用禁用适配器
界面效果图如下: 报表界面 说下关键代码 需要开启 Windows Management Instrumentation服务(默认已经开启),在程序中需要增加 Management引用. 主要有Net ...
- .net中XML的创建02(linqToXml)
linqToXml比较的灵活和方便,它是基于函数式编程具体的使用如下:引用程序集using System.Xml.Linq; 1.创建XDocument并设置文档头 XDocument XDoc = ...
- 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query
Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...
- day05
1.递归 利用递归实现阶乘(1*2*3*4*5*6*7) def func(num): if num == 1: return 1 return num * func(num-1) x = func( ...
- bind函数
bind函数把一个本地协议地址赋予一个套接字 对于网际协议,协议地址是32位的IPv4地址或128位的IPv6与16位的TCP或UDP端口号的组合 int bind ( int sockfd, con ...
- codevs 3269 混合背包
题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体 ...
- The executable was signed with invalid entitlements.
如图,出现这个的原因是 配置文件(provisioning profile)和 app 授权文件中的 entitlements(授权) 不匹配 具体应该从 配置文件 和证书的对应 问 ...
- memcpy函数的使用方法
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 1.函数原型 void *memcpy(void * ...
- 转:php连接oracle设定字符集,避免乱码
原文来自于:http://muyu.iteye.com/blog/399884 数据库用oracle,当php连接oracle的时候,最好指定字符集. 查PHP手册,oci_connect的第四个参数 ...