我想在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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子.稍微调整一下.您可以要求服务器"执行字符串回调",在这种情况下,服务器会反转字符串并调用所有已订阅的客户端回调.
现在,问题出现了:如果我想实现一个所有客户端都"注册"服务器的系统,并且服务器可以"询问"客户端是否还活着,你会用回调来实现吗(所以不要这样做"stringcallback"是一种TellTheClientThatIAmStillHereCallback).通过检查回调上的通信状态,我也可以"知道"客户端是否已经死亡.与此类似的东西:
Subscribers.ForEach(delegate(IStringCallback callback)
{
if (((ICommunicationObject)callback).State == CommunicationState.Opened)
{
callback.StringCallbackFunction(new string(retVal));
}
else
{
Subscribers.Remove(callback);
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题,换句话说:
所以基本上,你会使用回调来验证客户的"仍然生存状态",或者你会使用民意调查并跟踪"我没听说过客户多久"......
我在使用 WCF 和回调时遇到了类似的情况。我不想使用轮询,但我使用的是“可靠”协议,因此如果客户端死亡,那么它会挂起服务器直到超时并崩溃。
我不知道这是否是最正确或最优雅的解决方案,但我所做的是在服务中创建一个类来表示客户端代理。此类的每个实例都包含对客户端代理的引用,并且每当服务器设置该类的“消息”属性时就会执行回调函数。通过这样做,当客户端断开连接时,单个包装类将获得超时异常,并将其自身从服务器的侦听器列表中删除,但服务不必等待它。这实际上并不能回答您关于确定客户端是否还活着的问题,但它是构建服务来解决问题的另一种方式。如果您需要知道客户端何时死亡,您可以了解客户端包装器何时从侦听器列表中删除自身。
| 归档时间: |
|
| 查看次数: |
5299 次 |
| 最近记录: |