WCF事件通知具体实现方法详解
创始人
2024-06-23 10:20:44
0

WCF开发工具是由微软公司推出的一款功能强大的开发插件,它在实际应用中可以为我们提供许多有用的帮助。在这里我们将会为大家详细介绍一下WCF事件通知的相关实现方法,以方便大家掌握这方面的应用技巧。#t#

看了一些WCF的例子,实现WCF事件通知使用的是多播委托的特性,有点复杂,操作起来也不是很直观,看到一堆委托和事件我一般头就晕了。下面介绍一种使用观察者模式实现事件通知的简单方法。没别的,就是简单,简单最美。

工程代码如下:

1.定义接口

  1. [ServiceContract(SessionModeSessionMode = SessionMode.Required, 
    CallbackContract = typeof(IWriteLogCallback))]  
  2. public interface ILogService  
  3. {  
  4. [OperationContract(IsInitiating = true, IsTerminating = false)]  
  5. void Write(string logMsg);  
  6. [OperationContract(IsInitiating = true, IsTerminating = false)]  
  7. void RegisterListener();  
  8. [OperationContract(IsInitiating = false, IsTerminating = false)]  
  9. void UnregisterListener();  
  10. }  
  11. [ServiceContract]  
  12. public interface IWriteLogCallback  
  13. {  
  14. [OperationContract(IsOneWay = true)]  
  15. void OnWriteLog(string logMsg);  

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

2.服务实现

  1. [ServiceBehavior(  
  2. IncludeExceptionDetailInFaults = true,  
  3. InstanceContextModeInstanceContextMode = InstanceContextMode.Single,  
  4. ConcurrencyModeConcurrencyMode = ConcurrencyMode.Multiple)]  
  5. class LogService:ILogService  
  6. {  
  7. public LogService()  
  8. {  
  9. Trace.WriteLine("Create LogService Instance.");  
  10. }  
  11. Dictionary listeners = new Dictionary
    ();  
  12. private void BroadCast(string logMsg)  
  13. {  
  14. List errorClints = new List();  
  15. foreach (KeyValuePair listener in listeners)  
  16. {  
  17. try  
  18. {  
  19. listener.Value.GetCallbackChannel().OnWriteLog(logMsg);  
  20. }  
  21. catch (System.Exception e)  
  22. {  
  23. errorClints.Add(listener.Key);  
  24. Trace.WriteLine("BROAD EVENT ERROR:" + e.Message);  
  25. }  
  26. }  
  27. foreach (string id in errorClints)  
  28. {  
  29. listeners.Remove(id);  
  30. }  
  31. }  
  32. #region ILogService 成员  
  33. public void Write(string logMsg)  
  34. {  
  35. Trace.WriteLine("Write LOG:"+logMsg);  
  36. BroadCast(logMsg);  
  37. }  
  38. public void RegisterListener()  
  39. {  
  40. listeners.Add(OperationContext.Current.SessionId, OperationContext.Current);  
  41. Trace.WriteLine("SessionID:" + OperationContext.Current.SessionId);  
  42. Trace.WriteLine("Register listener. Client Count:" + 
    listeners.Count.ToString());  
  43. }  
  44. public void UnregisterListener()  
  45. {  
  46. listeners.Remove(OperationContext.Current.SessionId);  
  47. Trace.WriteLine("SessionID:" + OperationContext.Current.SessionId);  
  48. Trace.WriteLine("Unregister listener. Client Count:" + 
    listeners.Count.ToString());  
  49. }  
  50. #endregion  
  51. } Dictionary listeners 

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

3.客户端访问

定义回调的客户端:

  1. class LogClient:IWriteLogCallback  
  2. {  
  3. #region IWriteLogCallback 成员  
  4. public void OnWriteLog(string logMsg)  
  5. {  
  6. Trace.WriteLine("RECV LOG EVENT:" + logMsg);  
  7. }  
  8. #endregion  

然后在程序中使用它:

  1. class Program  
  2. {  
  3. static void Main(string[] args)  
  4. {  
  5. Trace.Listeners.Add(new ConsoleTraceListener());  
  6. LogClient client = new LogClient();  
  7. ILogService service = DuplexChannelFactory
    .CreateChannel(client,  
  8. new WSDualHttpBinding(), new EndpointAddress
    ("http://localhost:8888/log"));  
  9. //订阅消息  
  10. service.RegisterListener();  
  11. service.Write("Client start");  
  12. Console.WriteLine("Press enter key to exit.");  
  13. Console.ReadLine();  
  14. service.UnregisterListener();  

WCF事件通知实现时需要注意的问题:

A. 因为客户也要监听端口,所以确保防火墙没有对它进行阻止。

B. 这里使用的是单实例的服务,所以需要进行多进程访问的保护,才能实际使用。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...