我正在使用net.tcp和netTcpBinding组合一个WCF服务,以便与我的Silverlight客户端进行双工通信。我从Silverlight应用程序调用服务,服务调用另一个服务器,在WCF服务类中传递一个回调方法。远程服务器多次回调,每次都回调,WCF服务使用callbackchannel将数据发送到Silverlight客户端。这大部分时间都很好用。
如果用户输入了大量请求,则在大量回调已经生效后,我会收到TimeoutException。 (显然,在其他地方有一些工作要做以防止这种情况,但我首先想要证明这项服务的合理性。)
我希望在尝试回调Silverlight客户端之前做某种'if(client.ConnectionState == faulted)'检查,但我似乎无法找到保持连接状态的对象。有吗?我是从错误的一方接近这个吗?
这是我第一次进入服务net.tcp和duplex。我刚搬家,我的WCF圣经仍然在一个盒子里。某处。 :-)所以,我不能做我平常的背景阅读。
任何指针都会感激不尽。这里有一些简单的代码,以防我的描述过于浓郁:
private IActiveDirectoryClient client;
private AsyncSearchRunner runner;
public void Search(Request request)
{
this.client = OperationContext.Current.GetCallbackChannel<IActiveDirectoryClient>();
runner = new AsyncSearchRunner();
runner.Run(request.SearchRoot, request.SearchFilter, request.PageSize,
System.DirectoryServices.Protocols.SearchScope.Subtree, SendObjects);
}
private void SendObjects(List<DirectoryObject> items)
{
Response response = new Response();
response.DirectoryObjects = items.ToArray();
client.SendResponse(response);
}
答案 0 :(得分:0)
是的,State
类中定义了ClientBase<>
属性(所有代理类都派生自ClientBase<>
)。
有一些代理包装器可以处理连接的故障状态并根据需要重新建立连接。 Google为“wcf代理包装器”。
如果你使用某种ServiceLocator模式,你也可以自酿一些东西。