您还可以进行一次性状态查询。来自 MSDN:
如果需要对远程呈现体进行一次性呈现查询,则创建视图并将其拆除是应用程序的次优解决方案。此外,应用程序需要等待并跟踪是否已收到所有出席信息。
另一种方法是在端点的PresenceServices属性上使用BeginPresenceQuery(IEnumerable<String>, [], EventHandler<RemotePresentitiesNotificationEventArgs>, AsyncCallback, Object)
和方法。EndPresenceQuery(IAsyncResult)
请参阅http://msdn.microsoft.com/en-us/library/office/hh383136%28v=office.14%29.aspx
例子
您可以像这样调用存在查询。第三个位置的null
参数是事件处理程序,当接收到存在时将触发,它不是必需的,因为我们处理的是结果EndPresenceQuery
。您也可以传递一个事件处理程序而不关心 的结果EndPresenceQuery
,这取决于您。
endpoint.PresenceServices.BeginPresenceQuery(
new[] { "sip:user@example.com" }, // Collection of sip addresses to query
new[] { "state" }, // Collection of presence catrgories to query
null, // The eventhandler to call when presence is recieved
(ar) => {
var result = endpoint.PresenceServices.EndPresenceQuery(ar);
// process the recieved containers in 'result' here.
},
null); // The state object
但是,当您为将被多次查询的状态运行 WCF 服务时,我会说订阅状态可能比每次都执行单个查询更好。我曾经使用以下逻辑构建了一个类似的系统:
- 在 WCF 上获取传入状态请求。
- 如果 WCF 服务知道此 SIP uri 存在(已订阅),则立即返回缓存的存在。
- 如果不知道,请订阅存在。
- 收到出席信息后,返回结果并将出席信息添加到缓存中。
- 任何时候订阅用户更新他们的状态,都会触发一个事件来更新缓存。
- 如果在一段时间内没有收到单个用户的状态查询,则取消订阅状态并从缓存中删除。
此处的主要优点是,对于同一用户的状态的多个后续查询,您不必每次都查询 Lync 服务器。您的服务响应速度会快很多,并且您可以推送出席信息,而不必每次都进行轮询。