2

PresenceViewは、手動でプロビジョニングされたアプリケーションエンドポイントを使用して作成されます。私はそれに3つのターゲットを提供しましたが、それらはすべて「サブスクライブ」を報告しています。しかし、私は最初の通知しか受け取りません。その後、何も起こりません。ポーリングの場合も同じです。NotificationRecievedイベントは、最初の通知の後で発生していません。Lyncイベントログにはエラーは表示されず、期待値もスローされません。

私のセットアップは、DC、Lync Server、およびアプリケーションプールとしても機能するDeveloperマシンを備えた仮想環境です。すべてが大丈夫に見えます。

以下は私のコードのサンプルです。私のソリューションは、小さなコンソールアプリケーションとlyncコードを使用したプロジェクトの2つのプロジェクトで構成されています。これは、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

これはかなり古いことに気づきましたが、最近まったく同じ問題が発生したので、答える価値があるかもしれません。

私の場合、その理由は、サーバーがアプリケーションエンドポイントへの接続を確立できなかったためです。ここのコードには何も問題がないので、2台のマシン間のファイアウォールまたはルーティングの問題である可能性があります。

アプリケーションエンドポイントを設定するときに、ポートを定義します。そのポートは、アプリケーションエンドポイントをホストしているマシン(この場合は開発者のマシン)でアクセス可能である必要があります。

  • アプリケーションエンドポイントを確立すると、サーバーへの接続が開きます(通常はポート5061だと思います)。
  • RemotePresenceViewにサブスクライブすると、そのサブスクリプションリクエストがその接続に送信され、サーバーは同じ接続でサブスクライブされたすべてのプレゼンティティ(ばかげた言葉)の現在の状態の通知で応答します。これが最初の通知を受け取る理由です。
  • 以降のすべての通知について、サーバーは、エンドポイント用に定義したポートでアプリケーションエンドポイントホストマシンに接続しようとします。これが問題の原因である可能性があります。

ユーザーエンドポイントの場合、ポートが開いていることは想定されていないため、サーバーはクライアントのサーバーへの接続を介して通知を送信するだけなので、それが機能します。

于 2013-08-08T08:57:23.340 に答える