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

WCF實(shí)現(xiàn)事件通知相關(guān)應(yīng)用技巧介紹

開發(fā) 開發(fā)工具
WCF實(shí)現(xiàn)事件通知是一個(gè)比較容易掌握的知識(shí)點(diǎn),不過在實(shí)現(xiàn)的過程中,我們還是需要注意一些事項(xiàng),以保證功能的完善性。

WCF中有一些方法的應(yīng)用對(duì)于初學(xué)者來說還是比較容易應(yīng)用。只要熟練的聯(lián)系這些方法操作,一般都能牢固的掌握。看了一些WCF的例子,實(shí)現(xiàn)事件通知使用的是多播委托的特性,有點(diǎn)復(fù)雜,操作起來也不是很直觀,看到一堆委托和事件我一般頭就暈了。#t#

下面介紹一種使用觀察者模式WCF實(shí)現(xiàn)事件通知的簡單方法。沒別的,就是簡單,簡單最美。
工程代碼如下:

WCF實(shí)現(xiàn)事件通知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);  

為了簡單舉了一個(gè)寫日志的例子, Write(string logMsg)就是寫入日志的方法,參數(shù)logMsg是需要寫入的日志信息。當(dāng)客戶單沒有調(diào)用RegisterListener()訂閱事件的時(shí)候,是不會(huì)收到寫日志的事件通知的,相應(yīng)的要獲得寫日志的事件通知,就需要調(diào)用RegisterListener()方法。如果要取消訂閱就調(diào)用UnregisterListener()方法。寫日志的功能和事件的訂閱功能是分開的。

WCF實(shí)現(xiàn)事件通知2.服務(wù)實(shí)現(xiàn)

  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包含了所有的事件訂閱者。發(fā)布事件的時(shí)候,如果調(diào)用訂閱者的回調(diào)函數(shù)失敗,就把該訂閱者從listeners移除。代碼很簡單,就不多說了。

WCF實(shí)現(xiàn)事件通知3.客戶端訪問

定義回調(diào)的客戶端:

  1. class LogClient:IWrite
    LogCallback  
  2. {  
  3. #region IWriteLog
    Callback 成員  
  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實(shí)現(xiàn)事件通知需要注意的問題:
A. 因?yàn)榭蛻粢惨O(jiān)聽端口,所以確保防火墻沒有對(duì)它進(jìn)行阻止。
B. 這里使用的是單實(shí)例的服務(wù),所以需要進(jìn)行多進(jìn)程訪問的保護(hù),才能實(shí)際使用。

責(zé)任編輯:曹凱 來源: 博客園
相關(guān)推薦

2010-02-23 14:48:38

WCF事件通知

2010-02-24 11:22:04

WCF方法重載

2009-12-08 16:42:48

WCF Service

2009-12-07 18:33:31

WCF Service

2010-02-23 10:57:34

WCF Streami

2010-02-22 17:58:06

WCF異步上傳

2010-02-22 11:25:50

WCF DateSet

2010-02-23 17:30:41

WCF部署于IIS

2009-12-22 17:30:47

WCF Address

2010-02-24 12:49:39

WCF枚舉

2010-02-22 16:19:25

WCF自托管

2010-02-22 16:26:47

WCF傳輸數(shù)據(jù)

2010-03-01 13:06:49

WCF繼承

2009-12-21 11:19:50

WCF配置文件

2009-12-21 16:04:45

WCF Dispose

2010-02-22 11:02:06

WCF元數(shù)據(jù)

2010-01-05 15:35:21

.NET Framew

2009-12-08 10:52:30

WCF雙工通信

2009-12-21 14:49:27

2010-02-25 09:50:30

WCF路由截獲消息
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩国产一区二区 | 欧美福利在线 | 久久精品欧美一区二区三区不卡 | 精品婷婷 | 呦呦在线视频 | 精品啪啪 | 91免费电影 | 成人欧美日韩一区二区三区 | 国产成人一区二区三区 | 亚洲激情av | 久久33| 久久国内 | 亚洲成人一级片 | 欧美伊人影院 | 欧美激情综合网 | 精品一区二区视频 | 久草精品视频 | 亚洲国产欧美在线 | 中文字幕不卡在线观看 | 久久久久久成人 | 久久久久久久久久久久久久av | 日批av| 九色在线观看 | 狠狠亚洲| 亚洲精品自在在线观看 | 操人网| 少妇午夜一级艳片欧美精品 | 久久久久国产精品午夜一区 | 久久久久久久亚洲精品 | 性色综合| 伊人网站视频 | 亚洲一区二区三区免费在线 | 亚洲国产精品99久久久久久久久 | 日本视频一区二区 | 国产男女视频网站 | 懂色av色香蕉一区二区蜜桃 | 日日干夜夜操 | 欧美中文字幕 | 国产成人精品一区二区三区四区 | 在线看片网站 | 国产激情视频网站 |