クライアントが存在するかどうかに関係なく、このサービスにアクセスできるかどうかに関係なく、永久に実行されるサービスがありますが、クライアントのアクティビティがなく、クライアントに接続できるようになります。
これは、たとえば、休暇期間の後、サービスを手動で再起動する必要なく、サービスに接続できるようにしたいためです。
現時点では、10 分以内に接続が受信されない場合、サービスは切断されますが、時間を指定したくありません。無限の時間が必要です。
ありがとう。
、または非常に高い値を設定できますが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か月を設定します。その期間の間にサービスに単純なキープアライブメッセージ(基本的にはサービスで何らかの操作を呼び出すだけ)を送信すると、接続は維持されます。
私はこれを修正します:
ReceiveTimeout
、1 分で。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));
}
}