WCF实现事件通知是一个比较容易掌握的知识点,不过在实现的过程中,我们还是需要注意一些事项,以保证功能的完善性。

  WCF中有一些方法的应用对于初学者来说还是比较容易应用。只要熟练的联系这些方法操作,一般都能牢固的掌握。看了一些WCF的例子,实现事件通知使用的是多播委托的特性,有点复杂,操作起来也不是很直观,看到一堆委托和事件我一般头就晕了。

下面介绍一种使用观察者模式WCF实现事件通知的简单方法。没别的,就是简单,简单最美。
工程代码如下:

WCF实现事件通知1.定义接口

 [ServiceContract(SessionModeSessionMode =
  SessionMode.Required, CallbackContract
 = typeof(IWriteLogCallback))]
 public interface ILogService
 {
 [OperationContract(IsInitiating =
 true, IsTerminating = false)]
 void Write(string logMsg);
 [OperationContract(IsInitiating =
 true, IsTerminating = false)]
 void RegisterListener();
 [OperationContract(IsInitiating =
 false, IsTerminating = false)]
 void UnregisterListener();
 }
 [ServiceContract]
 public interface IWriteLogCallback
 {
 [OperationContract(IsOneWay = true)]
 void OnWriteLog(string logMsg);
 } 

为了简单举了一个写日志的例子, Write(string logMsg)就是写入日志的方法,参数logMsg是需要写入的日志信息。当客户单没有调用RegisterListener()订阅事件的时候,是不会收到写日志的事件通知的,相应的要获得写日志的事件通知,就需要调用RegisterListener()方法。如果要取消订阅就调用UnregisterListener()方法。写日志的功能和事件的订阅功能是分开的。

WCF实现事件通知2.服务实现

 [ServiceBehavior(
 IncludeExceptionDetailInFaults = true,
 InstanceContextModeInstanceContextMode =
  InstanceContextMode.Single,
 ConcurrencyModeConcurrencyMode =
 ConcurrencyMode.Multiple)]
 class LogService:ILogService
 {
 public LogService()
 {
 Trace.WriteLine("Create LogService Instance.");
 }
 Dictionary<string, OperationContext>
 listeners = new Dictionary<string,
  OperationContext>();
 private void BroadCast(string logMsg)
 {
 List<string> errorClints = new List<string>();
 foreach (KeyValuePair<string, OperationContext>
 listener in listeners)
 {
 try
 {
 listener.Value.GetCallbackChannel
 <IWriteLogCallback>().OnWriteLog(logMsg);
 }
 catch (System.Exception e)
 {
 errorClints.Add(listener.Key);
 Trace.WriteLine("BROAD EVENT ERROR:" + e.Message);
 }
 }
 foreach (string id in errorClints)
 {
 listeners.Remove(id);
 }
 }
 #region ILogService 成员
 public void Write(string logMsg)
 {
 Trace.WriteLine("Write LOG:"+logMsg);
 BroadCast(logMsg);
 }
 public void RegisterListener()
 {
 listeners.Add(OperationContext.Current.
 SessionId, OperationContext.Current);
 Trace.WriteLine("SessionID:" +
  OperationContext.Current.SessionId);
 Trace.WriteLine("Register listener.
 Client Count:" + listeners.Count.ToString());
 }
 public void UnregisterListener()
 {
 listeners.Remove(OperationContext
 .Current.SessionId);
 Trace.WriteLine("SessionID:" +
 OperationContext.Current.SessionId);
 Trace.WriteLine("Unregister listener.
  Client Count:" + listeners.Count.ToString());
 }
 #endregion
 } Dictionary<string, OperationContext> 

listeners包含了所有的事件订阅者。发布事件的时候,如果调用订阅者的回调函数失败,就把该订阅者从listeners移除。代码很简单,就不多说了。

WCF实现事件通知3.客户端访问

定义回调的客户端:

 class LogClient:IWrite
 LogCallback
 {
 #region IWriteLog
 Callback 成员
 public void OnWriteLog
 (string logMsg)
 {
 Trace.WriteLine("RECV
 LOG EVENT:" + logMsg);
 }
 #endregion
 } 

然后在程序中使用它:

 class Program
 {
 static void Main(string[] args)
 {
 Trace.Listeners.Add(new
  ConsoleTraceListener());
 LogClient client = new LogClient();
 ILogService service =
  DuplexChannelFactory<ILogService>.
 CreateChannel(client,
 new WSDualHttpBinding(), new
 EndpointAddress("http:
 //localhost:8888/log"));
 //订阅消息
 service.RegisterListener();
 service.Write("Client start");
 Console.WriteLine("Press
 enter key to exit.");
 Console.ReadLine();
 service.UnregisterListener();
 } 

WCF实现事件通知需要注意的问题:
A. 因为客户也要监听端口,所以确保防火墙没有对它进行阻止。
B. 这里使用的是单实例的服务,所以需要进行多进程访问的保护,才能实际使用。

本文来自:http://developer.51cto.com/

WCF实现事件通知相关应用技巧介绍的更多相关文章

  1. ------- 软件调试——注销 QQ 过滤驱动设置的事件通知 CallBack (完)-------

    ---------------------------------------------------------------------------------- 本系列的最后一篇演示如何通过调试手 ...

  2. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

  3. C#的Xamarin开发小米盒子应用并以WCF实现微信通知

    对于熟悉C#语言的开发人员而言,用Xamarin开发Android应用也是一个不错的选择.小米盒子是Android系统.当然也就能够使用Xamarin来开发.首选来看效果图. watermark/2/ ...

  4. SQL Server 事件通知(Event notifications)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...

  5. spring事件通知机制详解

    优势 解耦 对同一种事件有多种处理方式 不干扰主线(main line) 起源 要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类: ApplicationEventPub ...

  6. Linux内核基础--事件通知链(notifier chain)

    转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...

  7. 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?

    写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...

  8. .NET Core 实践二:事件通知和异步处理

    首先让我们来先看一个例子: 这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单).财务(支付).仓储(备货)和物流(运输). 从图中我们可以看到, ...

  9. 08 Zabbix4.0系统配置事件通知 - 动作Action

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 08 Zabbix4.0系统配置事件通知 - 动作Action 请点击查看Zabbix3.0.8版 ...

随机推荐

  1. js数组去重几种思路

    在一些后台语言中都内置了一些方法来处理数组或集合中重复的数据.但是js中并没有类似的方法,网上已经有一些方法,但是不够详细.部分代码来源于网络.个人总计如下:大致有4种思路 1)使用两次循环比较原始的 ...

  2. win10上部署Hadoop-2.7.3——非Cygwin、非虚拟机

    开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在Win10下安装Hadoop(之后再在Lunix下弄),找到不少文章,以下是 ...

  3. MySQL 优化之 ICP (index condition pushdown:索引条件下推)

    ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...

  4. SVN版本冲突,导致出现Files 的值“ < < < < < < < .mine”无效

    只要根据错误提示,找到相应文件夹下的\obj\Debug文件夹下的 相应名字.csproj.FileListAbsolute.txt, 打开并删除含有'<<<<<< ...

  5. MVVM大比拼之avalon.js源码精析

    简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高. 将原始对象用object.defineProperty重写,不需要用户像用knoc ...

  6. SAE+WordPress快速搭建个人博客

    前些天一时冲动,买了个域名,我想总不能放着不用吧,干脆就搭建了一个个人博客.下面我把搭建的过程分享给大家.注意,此文并不是攻略,只是为了记录下这个从无到有的过程,当然,假如解决了你的疑惑,那当然是极好 ...

  7. 写自己的Socket框架(一)

    本系列仅介绍可用于生产环境的C#异步Socket框架,如果您在其他地方看到类似的代码,不要惊讶,那可能就是我在参考开源代码时,直接“剽窃”过来的. 1.在脑海里思考一下整个socket的链接的处理流程 ...

  8. Android Studio2.1.2 Java8环境下引用Java Library编译出错

    转载请注明出处:http://www.cnblogs.com/LT5505/p/5685242.html 问题:在Android Studio2.1.2+Java8的环境下,引用Java Librar ...

  9. 单选按钮加confirm进行判断返回false任被选中问题

    <html> <head> <script language="javascript"> var checkValue = "&quo ...

  10. Nginx服务器之Nginx与tomcat结合访问jsp

    本文使用linux centos系统 本文概述: JSP是一种动态网页技术标准.使用的方式是在HTML文件中插入程序段和JSP标记,而形成JSP文件.使用JSP开发WEB应用可以跨平台开发.但jsp需 ...