我有一个 WCF、基于 tcp 的客户端服务器应用程序(自托管),其中通信通过回调发生,InstanceContextMode 是 PerSession。我想为这个应用程序提供一个管理界面,它允许管理员查看所有连接用户的详细信息并提供一定程度的管理控制(例如强制断开会话)。
由于我使用回调,每个客户端代理通过构造函数为服务器提供其实例上下文。例如,客户端使用以下命令将其代理实例化到服务器:
public class ClientCallbackHandler : IMyServerCallback
{
proxy = new MyServiceClient(new InstanceContext(this));
在服务器端,我使用以下方法检索此上下文:
var currenContext = OperationContext.Current;
我最初的想法是实现一个单独的“SessionAdmin”类,它维护一组 OperationContext 对象(即 - 持有对每个连接客户端的上下文的引用)。每个新的客户端会话都将注册到“SessionAdmin”类的相同实例,从而提供一个可以访问所有客户端会话的中心类。
这在一定程度上是有效的,但是当我访问我的“OperationContext”对象集合以获取客户端详细信息或执行一些其他操作时,我注意到上下文正在抛出“对象已处理”异常。
首先,我的问题是,以上听起来像是对 WCF 会话提供服务器端管理控制的合理方式吗?如果是这样,我如何在服务器端维护一组客户端会话或其上下文而不释放这些对象?问题的一个例子是:
foreach(var context in MyContextCollection)
{
DisplayClientDetails(context);
...
}
public void DisplayClientDetails(OperationContext context)
{
var sessionID = context.SessionId; //No problem here
var user = context.ServiceSecurityContext.PrimaryIdentity.Name; //ServiceSecurityContext has been disposed