博客来源:http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx实现服务(工程WcfDuplexMessageService)
(1) 为了所有客户端都注册到一个服务对象上,所以定义服务端为Singleton实例模式:
InstanceContextMode=InstanceContextMode.Single (Singleton的实例在服务Host启动即实例化)
问题一:“服务端为Singleton实例模式”,是什么?有什么作用?“注册到一个服务对象上”什么意思?还有不是在一个服务对象上的时候???
(2) 定义了一个static的List<IClient>统一保存客户端回调实例,并公开为Property,便于ServerUI能访问。
(3) 为了防止广播时不会因为客户端关闭而导致服务端异常,监听了Channel.Closing事件
客户端关闭(Channel被关闭)时就会触发这个事件,在此事件处理中移除该客户端回调实例。
view plaincopy to clipboardprint? 1. using System;
2. using System.Collections.Generic;
3. using System.ServiceModel;
4.
5. namespace WcfDuplexMessageService
6. {
7. [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
8. public class MessageService : IMessageService, IDisposable
9. {
10. public static List<IClient> ClientCallbackList { get; set; }
11.
12. public MessageService()
13. {
14. ClientCallbackList = new List<IClient>();
15. }
16.
17. public void RegisterClient()
18. {
19. var client = OperationContext.Current.GetCallbackChannel<IClient>();
问题二:“OperationContext.Current.GetCallbackChannel”指什么???有什么作用???
20. var id = OperationContext.Current.SessionId;
指什么?有什么作用???
21. Console.WriteLine("{0} registered.", id);
22. OperationContext.Current.Channel.Closing += new EventHandler(Channel_Closing);
23. ClientCallbackList.Add(client);
24. }
25.
26. void Channel_Closing(object sender, EventArgs e)
27. {
28. lock (ClientCallbackList)
29. {
30. ClientCallbackList.Remove((IClient)sender);
31. }
32. }
33.
34. public void Dispose()
35. {
36. ClientCallbackList.Clear();
37. }
38. }
39. } 这个类的主要作用是将客户端实例添加到“ClientCallbackList”中实现注册和管理。只是不知道“ var client = OperationContext.Current.GetCallbackChannel<IClient>();
var id = OperationContext.Current.SessionId; ”这两句处理的什么???
(1) 为了所有客户端都注册到一个服务对象上,所以定义服务端为Singleton实例模式:
InstanceContextMode=InstanceContextMode.Single (Singleton的实例在服务Host启动即实例化)
问题一:“服务端为Singleton实例模式”,是什么?有什么作用?“注册到一个服务对象上”什么意思?还有不是在一个服务对象上的时候???
(2) 定义了一个static的List<IClient>统一保存客户端回调实例,并公开为Property,便于ServerUI能访问。
(3) 为了防止广播时不会因为客户端关闭而导致服务端异常,监听了Channel.Closing事件
客户端关闭(Channel被关闭)时就会触发这个事件,在此事件处理中移除该客户端回调实例。
view plaincopy to clipboardprint? 1. using System;
2. using System.Collections.Generic;
3. using System.ServiceModel;
4.
5. namespace WcfDuplexMessageService
6. {
7. [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
8. public class MessageService : IMessageService, IDisposable
9. {
10. public static List<IClient> ClientCallbackList { get; set; }
11.
12. public MessageService()
13. {
14. ClientCallbackList = new List<IClient>();
15. }
16.
17. public void RegisterClient()
18. {
19. var client = OperationContext.Current.GetCallbackChannel<IClient>();
问题二:“OperationContext.Current.GetCallbackChannel”指什么???有什么作用???
20. var id = OperationContext.Current.SessionId;
指什么?有什么作用???
21. Console.WriteLine("{0} registered.", id);
22. OperationContext.Current.Channel.Closing += new EventHandler(Channel_Closing);
23. ClientCallbackList.Add(client);
24. }
25.
26. void Channel_Closing(object sender, EventArgs e)
27. {
28. lock (ClientCallbackList)
29. {
30. ClientCallbackList.Remove((IClient)sender);
31. }
32. }
33.
34. public void Dispose()
35. {
36. ClientCallbackList.Clear();
37. }
38. }
39. } 这个类的主要作用是将客户端实例添加到“ClientCallbackList”中实现注册和管理。只是不知道“ var client = OperationContext.Current.GetCallbackChannel<IClient>();
var id = OperationContext.Current.SessionId; ”这两句处理的什么???
解决方案 »
- 更新datagridview数据,不报错,也更新不了,求高手解决!
- 快速排序,当数组长度大于13时就越界了 比如100 麻烦各位看看
- c# 用对象作函数参数时编译不过 提示该对象的类比函数可访问性低 请指教
- 请教大家为什么我用TDES(3重DES加密算法)加密解密字符串后,该字符串少了一截?
- 高分求助:关于动态添加组件
- 新手问个问题 C#如何实现在Dategridview中显示不规则的EXCEL表
- C:\Documents and Settings\xmj\Local Settings\Temp可以删除吗?大量temp作用是?
- c#中百分数的使用????????
- windows开发,如何判断是否在设计状态?
- 如何添加 类成员 的 代码提示 的 描述性语句 ???
- treeview 编辑节点
- c# 多线程问题,如何终止特定线程
使用 Current 属性和 GetCallbackChannel<T> 方法获取从方法中返回调用方的通道大部分可以写在配置文件里的把~~