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 ...
随机推荐
- 【USACO 1.5.1】数字金字塔
[题目描述] 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 ...
- 『重构--改善既有代码的设计』读书笔记----Extract Method
在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...
- angularjs学习笔记三——directive
AngularJS 通过被称为 指令 的新属性来扩展 HTML. 正如你所看到的,AngularJS 指令是以 ng 作为前缀的 HTML 属性. HTML5 允许扩展的(自制的)属性,以 data- ...
- 19 Remove Nth Node From End of List(去掉链表中倒数第n个节点Easy)
题目意思:去掉链表中倒数第n个节点 思路:1.两次遍历,没什么技术含量,第一次遍历计算长度,第二次遍历找到倒数第k个,代码不写了 2.一次遍历,两个指针,用指针间的距离去计算. ps:特别注意删掉 ...
- 每日一算法【one】
//有一个数组 {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677} 查找数组中是否有指定的某一个数. /** *------- ...
- linux命令——Grep 命令 用法大全
1. 参数: -I :忽略大小写 -c :打印匹配的行数 -l :从多个文件中查找包含匹配项 -v :查找不包含匹配项的行 -n:打印包含匹配项的行和行标 2.RE(正则表达式) \ 忽略正则表达式中 ...
- border做箭头的例子
<style> .test{ margin:0 auto; width:100px; height:100px; background:lightskyblue; position:rel ...
- springboot工程读取配置文件application.yml的写法
现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...
- spring mvc标准项目结构
src com.xxx.inews.dao com.xxx.inews.dao.impl com.xxx.inews.data.entity com.xxx.inews.data.vo com.xxx ...
- IOS笔记 1
< ![CDATA[ 笔记 UIWindows 与UIView的关系iOS的坐标系统视图层次结构视图坐标(Frame和Bounds区别)UIView的常用属性和方法坐标系统的变换UIView内容 ...