Если кому-то еще интересно, вот как я это делаю.
Я хочу оставить соединение открытым, поэтому я сбрасываю его в обработчике OnDisconnect.
Однако перед его сбросом я проверяю частный словарь "подписок" на объекте соединения, используя отражение.
Это позволяет мне отписаться от моих подключений в другом месте моего кода (OnNotificationEvent), и когда все подписки были отменены, я могу закрыть соединение.
Вот мой код:
void connection_OnDisconnect(object sender, SubscriptionErrorEventArgs args)
{
var c = (Dictionary<string, StreamingSubscription>)typeof(StreamingSubscriptionConnection).GetField("subscriptions",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(sender);
if (c.Count > 0)
{
// reopen the connection
((StreamingSubscriptionConnection)sender).Open();
using (var db = new Metrics_DatabaseEntities())
{
PushNotificationTest pt = new PushNotificationTest();
pt.RetObj = "Connection reset";
db.PushNotificationTests.Add(pt);
db.SaveChanges();
}
}
else
{
using (var db = new Metrics_DatabaseEntities())
{
PushNotificationTest pt = new PushNotificationTest();
pt.RetObj = "Connection closed!";
db.PushNotificationTests.Add(pt);
db.SaveChanges();
}
}
}
Пожалуйста, не обращайте внимания на плохой способ написания этого текста, это только моя первая версия, так как я планирую написать это более аккуратно в ближайшее время. Я просто подумал, что поделюсь своей методологией с людьми, которые могут быть заинтересованы.