成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF事件通知具體實現方法詳解

開發 開發工具
WCF事件通知的實現方法可以通過本文介紹的相關方法來實現,主要就是通過使用觀察者模式來進行操作。下面將會對此一一做一個介紹。

WCF開發工具是由微軟公司推出的一款功能強大的開發插件,它在實際應用中可以為我們提供許多有用的幫助。在這里我們將會為大家詳細介紹一下WCF事件通知的相關實現方法,以方便大家掌握這方面的應用技巧。#t#

看了一些WCF的例子,實現WCF事件通知使用的是多播委托的特性,有點復雜,操作起來也不是很直觀,看到一堆委托和事件我一般頭就暈了。下面介紹一種使用觀察者模式實現事件通知的簡單方法。沒別的,就是簡單,簡單最美。

工程代碼如下:

1.定義接口

  1. [ServiceContract(SessionModeSessionMode = SessionMode.Required, 
    CallbackContract = typeof(IWriteLogCallback))]  
  2. public interface ILogService  
  3. {  
  4. [OperationContract(IsInitiating = trueIsTerminating = false)]  
  5. void Write(string logMsg);  
  6. [OperationContract(IsInitiating = trueIsTerminating = false)]  
  7. void RegisterListener();  
  8. [OperationContract(IsInitiating = falseIsTerminating = 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<string, OperationContext> listeners = new Dictionary
    <string, OperationContext>();  
  12. private void BroadCast(string logMsg)  
  13. {  
  14. List<string> errorClints = new List<string>();  
  15. foreach (KeyValuePair<string, OperationContext> listener in listeners)  
  16. {  
  17. try  
  18. {  
  19. listener.Value.GetCallbackChannel<IWriteLogCallback>().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<string, OperationContext> 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<ILogService>
    .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. 這里使用的是單實例的服務,所以需要進行多進程訪問的保護,才能實際使用。

責任編輯:曹凱 來源: 博客園
相關推薦

2009-12-21 18:10:50

WCF實現事件通知

2010-02-24 16:30:52

WCF常見錯誤

2010-02-25 09:58:05

WCF配置指定Addr

2010-02-26 15:53:35

WCF套接字連接中斷

2010-02-24 16:39:27

WCF客戶端處理

2010-02-26 11:22:16

LitwareHR使用

2009-12-21 16:04:45

WCF Dispose

2010-02-22 17:34:39

WCF依賴屬性

2009-12-21 18:32:22

關閉WCF鏈接

2009-12-22 16:36:38

WCF重載

2010-02-26 16:20:56

WCF程序事務

2010-02-24 09:38:58

WCF應用編碼

2010-02-25 16:20:02

WCF客戶端

2010-02-04 11:23:25

C++反射機制

2009-12-30 14:36:29

Silverlight

2009-12-28 16:10:38

WPF生成文件

2010-02-25 13:54:48

WCF安全參數

2010-03-02 17:35:20

WCF服務加載

2010-02-25 11:23:29

WCF返回自定義格式

2010-03-01 16:31:58

WCF實現SOA
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区久久 | 91视在线国内在线播放酒店 | www.狠狠干| 2019天天干夜夜操 | 中文字幕日韩欧美 | 中文字幕一区二区三区四区 | 欧美日韩精品在线一区 | 一区二区三区免费看 | 国产综合精品一区二区三区 | 亚洲日日夜夜 | 天堂va在线 | 狠狠干天天干 | 91亚洲国产成人久久精品网站 | 亚洲精品一区二区三区在线 | 免费艹逼视频 | 男人av网| 成人免费看电影 | 91精品国产91久久久久久最新 | www久久99| 国产 欧美 日韩 一区 | 久热精品在线 | 国产欧美久久精品 | 日本黄色大片免费看 | 亚洲欧洲精品一区 | 国产免费一区 | 2023亚洲天堂 | 亚洲成人av在线 | 天堂资源最新在线 | 欧美日韩91 | 日韩欧美在线播放 | 国产精品欧美一区二区三区不卡 | 久久久91精品国产一区二区三区 | 黄色毛片黄色毛片 | 久久久免费毛片 | 91亚洲国产成人精品一区二三 | 欧美成人hd | 国产精品久久久久久久久久久久冷 | 久久高清亚洲 | 国产高清精品一区二区三区 | 99久久精品一区二区毛片吞精 | 91精品国产91久久久久久密臀 |