4

クライアントが存在するかどうかに関係なく、このサービスにアクセスできるかどうかに関係なく、永久に実行されるサービスがありますが、クライアントのアクティビティがなく、クライアントに接続できるようになります。

これは、たとえば、休暇期間の後、サービスを手動で再起動する必要なく、サービスに接続できるようにしたいためです。

現時点では、10 分以内に接続が受信されない場合、サービスは切断されますが、時間を指定したくありません。無限の時間が必要です。

ありがとう。

4

3 に答える 3

6

、または非常に高い値を設定できますがinactivityTimeout="infinite"、推奨されていませんが、クライアントが接続すると「永久に」消費できるようなサービスであってはなりません。

アップデート

私の間違いですが、inactivityTimeoutなどの他のタイムアウトのように無限に設定することはできないようreceiveTimeoutです。

でも、設定してみませんreceiveTimeout="infinite"か?inactivityTimeout有効にした場合にのみ使用されます。reliableSession信頼できるセッションが必要ない場合はreceiveTimeout、バインディングのオンを無限に設定するだけです。この場合receiveTimeoutは、非アクティブタイムアウトのようになります。信頼できるセッションを使用する必要がある場合、WCFは両方の値を使用してサービスがタイムアウトするタイミングを決定し、接続を維持するには両方が満たされる必要があります。の最大値inactivityTimeoutは「24.20:31:23.6470000」、基本的には24日と20.5時間のようです。したがって、最悪の場合のシナリオinactivityTimeout="24.20:31:23"では、まだかなり長い時間、ほぼ1か月を設定します。その期間の間にサービスに単純なキープアライブメッセージ(基本的にはサービスで何らかの操作を呼び出すだけ)を送信すると、接続は維持されます。

于 2012-08-12T16:25:51.180 に答える
1

私はこれを修正します:

  1. 30 秒ごとに接続をアクティブに保つために、クライアントからサーバーに ping を実行する方法。\
  2. サーバー バインディングではReceiveTimeout、1 分で。
  3. を作成したコールバックごとICommunicationObjectに、Closed イベントを使用して非アクティブなクライアントを削除します。
    //Adding a client callback
    OperationContext context = OperationContext.Current;
    ICallback callback = context.GetCallbackChannel<ICallback>();
    ICommunicationObject obj = (ICommunicationObject)callback;
    obj.Closed += new EventHandler(obj_Closed);

    //Event for inactive clients
    void obj_Closed(object sender, EventArgs e)
            {
                if (_callbacks.ContainsValue(((ITecnobelRemoteServiceCallback)sender)))
                {
                    var item = _callbacks.First(kvp => kvp.Value == (ITecnobelRemoteServiceCallback)sender));
                    _callbacks.Remove(item.Key);
                    treeViewClients.Nodes.RemoveByKey(item.Key.Id);
                    treeViewClients.Refresh();
                    _registeredUsers--;
                    listBoxStatus.Items.Add(String.Format("User {0} was inactive 
    and was removed", item.Key.Id));
                }
            }
于 2014-08-05T15:44:05.093 に答える