あなたのコメントで述べたように、クライアントが接続する(またはアプリが起動する)ときに、サブスクリプション名として一意のGUIDを持つ新しいサブスクリプションを作成できます。サブスクリプションが自動的に削除されるまでの時間間隔を設定するには、SubscriptionDescription.AutoDeleteOnIdle propertyを指定します。
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
var subscriptionname = Guid.NewGuid().ToString();
if (!namespaceManager.SubscriptionExists(topicname, subscriptionname))
{
SqlFilter updatedMessagesFilter =
new SqlFilter("mypro = 'test'");
namespaceManager.CreateSubscription(new SubscriptionDescription(topicname, subscriptionname) { AutoDeleteOnIdle = TimeSpan.FromMinutes(5) },
updatedMessagesFilter);
}
クライアントが切断されると、手動でサブスクリプションを削除できます。
if (namespaceManager.SubscriptionExists(topicname, subscriptionname))
{
namespaceManager.DeleteSubscription(topicname, subscriptionname);
}
注は:100%削除サブスクリプションを保証するために、あなたは、外部記憶装置に、クライアントとsubscriptionname(一意のGUID)に関する情報を保持することができ、そしてクライアントが再接続/接続するたびに、あなたがどうかを検出することができますレコードが存在する場合、新しいサブスクリプションを作成する前にそのサブスクリプションを削除することができます。
「購読者が切断した場合、対応する購読を自動的に削除する必要があります。」あなたの実際の要件についてさらに説明できますか? 「購読者の切断」は、加入者(クライアントユーザー)の切断またはアプリの停止を意味しますか? –
私はどちらの場合もそうだと思います。サブスクリプションごとに私は1つのクライアントしか持っていません。クライアントは、手動で停止したり、停止したり、破損したりすることができます。どのような場合でも、対応する購読を自動的に削除する必要があります。おそらくそれ以上のリンクでは、より明確に説明されています。可能な解決策:新しいクライアントごとに購読する名前として一意のGUIDを生成すること。クライアントが手動で停止した場合は、サブスクリプションを手動で削除します。破損した場合は、SubscriptionDescription.AutoDeleteOnIdleプロパティを使用して自動削除します。 – Tselofan