我有一个基于tcp的WCF客户端服务器应用程序(自托管),其中通过回调进行通信,而InstanceContextMode是PerSession。我想为这个应用程序提供一个Admin界面,允许管理员查看所有连接用户的详细信息并提供一定程度的管理控制(例如强制断开会话)。
由于我正在使用回调,因此每个客户端代理都通过构造函数向服务器提供其实例上下文。例如,客户端使用以下命令将其代理实例化到服务器:
public class ClientCallbackHandler : IMyServerCallback
{
proxy = new MyServiceClient(new InstanceContext(this));
在服务器端,我使用以下方法检索此上下文:
var currenContext = OperationContext.Current;
我最初的想法是实现一个单独的'SessionAdmin'类,它维护一个OperationContext对象的集合(即 - 保存对每个连接客户端的上下文的引用)。每个新的客户端会话都将注册“SessionAdmin”类的相同实例,从而提供可访问所有客户端会话的中心类。
这在一定程度上有效,但在我访问我的'OperationContext'对象集合以获取客户端详细信息或执行其他操作时,我注意到上下文正在抛出'Object dispos'异常。
我的问题首先是,上述听起来像是一种合理的方式来提供对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