【发布时间】:2009-12-07 22:18:33
【问题描述】:
我想在 WCF 中创建一个简单的客户端-服务器示例。我对回调进行了一些测试,到目前为止效果很好。我用以下界面玩了一下:
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IStringCallback))]
public interface ISubscribeableService
{
[OperationContract]
void ExecuteStringCallBack(string value);
[OperationContract]
ServerInformation Subscribe(ClientInformation c);
[OperationContract]
ServerInformation Unsubscribe(ClientInformation c);
}
这是一个简单的例子。稍微调整了一下。您可以要求服务器“执行字符串回调”,在这种情况下,服务器会反转字符串并调用所有订阅的客户端回调。
现在,问题来了:如果我想实现一个所有客户端都向服务器“注册”的系统,并且服务器可以“询问”客户端是否还活着,你会用回调来实现吗(所以而不是这种“stringcallback”,一种 TellTheClientThatIAmStillHereCallback)。通过检查回调上的通信状态,我还可以“知道”客户端是否已死。类似的东西:
Subscribers.ForEach(delegate(IStringCallback callback)
{
if (((ICommunicationObject)callback).State == CommunicationState.Opened)
{
callback.StringCallbackFunction(new string(retVal));
}
else
{
Subscribers.Remove(callback);
}
});
我的问题,换一种说法:
- 服务器可能有 3 个客户端
- 客户端 A 死机(我拔掉了笔记本电脑的插头)
- 服务器死机并重新上线
- 新客户出现
所以基本上,您会使用回调来验证客户端的“仍然存在的状态”,还是使用轮询并跟踪“我有多久没有听说过客户端”...
【问题讨论】:
-
您如何连接到 WCF 服务器?你在使用 TCP 吗?这将改变实现池的方式。