2

PresenceView 是使用手动配置的应用程序端点创建的。我为它提供了三个目标,它们都报告“订阅”。但我只收到第一个通知。之后,什么也没有发生。轮询也是如此。NotificationRecieved 事件在第一次通知后未触发。Lync 事件日志显示没有错误,也没有引发任何期望。

我的设置是一个带有 DC、Lync Server 和 Developer 机器的虚拟环境,它也充当应用程序池。一切看起来都很好。

以下是我的一些代码示例。我的解决方案包含两个项目:一个小型控制台应用程序和一个带有 lync 代码的项目。它基于 UCMA 代码示例中的 SubscribePresenceView 示例解决方案,它可以很好地更新存在状态,尽管它使用的是用户端点。

        public void Run()
    {
        _helper = new Helper(new ConsoleLogger());
        _applicationEndpoint = _helper.CreateApplicationEndpoint();


        var viewSettings = new RemotePresenceViewSettings();
        viewSettings.SubscriptionMode = RemotePresenceViewSubscriptionMode.Default;
        _presenceView = new RemotePresenceView(_applicationEndpoint, viewSettings);

        List<RemotePresentitySubscriptionTarget> targets = new List<RemotePresentitySubscriptionTarget>();
        targets.Add(new RemotePresentitySubscriptionTarget("sip:mortenl@mupersan.local"));
        targets.Add(new RemotePresentitySubscriptionTarget("sip:finnl@mupersan.local"));
        targets.Add(new RemotePresentitySubscriptionTarget("sip:andersl@mupersan.local"));

        this.WireUpHandlersForView(_presenceView);

        _presenceView.StartSubscribingToPresentities(targets);
    }

处理通知委托方法:

    private void RemotePresenceView_NotificationReceived(object sender, RemotePresentitiesNotificationEventArgs e)
    {
        // A RemotePresentityNotification will contain all the
        // categories for one user; Notifications can contain notifications
        // for multiple users.

        foreach (RemotePresentityNotification notification in e.Notifications)
        {
           Console.WriteLine("\nReceived a Notification for user "+ notification.PresentityUri + ".");

           // If a category on notification is null, the category
           // was not present in the notification. This means there were no
           // changes in that category.



           if (notification.AggregatedPresenceState != null)
           {
               Console.WriteLine("Aggregate State = " + notification.AggregatedPresenceState.Availability + ".");
           }

           if (notification.PersonalNote != null)
           {
               Console.WriteLine("PersonalNote: " + notification.PersonalNote.Message + ".");
           }

           if (notification.ContactCard != null)
           {
               // A ContactCard contains many properties; only display
               // some.
               ContactCard contactCard = notification.ContactCard;
               Console.WriteLine("ContactCard Company: " + contactCard.Company + ".");
               Console.WriteLine("ContactCard DisplayName: " + contactCard.DisplayName + ".");
               Console.WriteLine("ContactCard EmailAddress: " + contactCard.EmailAddress + ".");
           }           
        }
    }

如果您需要更多信息,请告诉我。

4

2 回答 2

1

从来没有找到解决方案,所以我继续使用 UserEndPoint 代替,它工作得很好。

于 2012-10-23T22:01:03.160 回答
1

我现在意识到这已经很老了,但是我最近遇到了完全相同的问题,因此可能值得回答。

就我而言,原因是服务器无法建立与应用程序端点的连接。我看不出这里的代码有什么问题,所以很可能是两台机器之间的防火墙或路由问题。

在设置应用程序端点时,您定义了一个端口,并且该端口需要在托管应用程序端点的机器上可以访问(在这种情况下是您的开发人员机器)。

  • 当您建立应用程序端点时,它会打开与服务器的连接(我认为通常是端口 5061)。
  • 当您订阅 RemotePresenceView 时,它会将该订阅请求发送到该连接,并且服务器将响应同一连接上所有订阅 Presentities(一个愚蠢的词)的当前状态的通知,这就是您收到第一个通知的原因。
  • 对于所有后续通知,服务器将尝试在您为端点定义的端口上连接回您的应用程序端点主机,这可能就是问题所在。

对于用户端点,您不需要打开端口,因此服务器只会通过客户端与服务器的连接发送通知,这就是它起作用的原因。

于 2013-08-08T08:57:23.340 回答