2011-01-01 14 views
14

Używamy modelu pub-sub w naszej aplikacji WCF, który jest bardzo podobny do próbki Microsoft: Design Patterns: List-Based Publish-Subscribe.Obsługa upuszczonych klientów w aplikacji WCF wiążącej dupleks

Podczas gdy usługa zapewnia pojęcie subscribe() i unsubscribe(), jaka jest najlepsza praktyka w obsłudze usuwania w sytuacji, gdy klient umiera lub błędy kanału? Obecnie, gdy klient podpisuje załączyć do ładowarki do prądu InstanceContext „s Closed i Faulted zdarzeń (użytkowników serwisu trybie kontekst instancja PerSession i netTcpBinding):

_communicationObject = OperationContext.Current.InstanceContext; 
_communicationObject.Closed += OnClientLost; 
_communicationObject.Faulted += OnClientLost; 

Handler OnClientLost prostu unsubscribes klienta, jednakże:

  1. Czy powyższe stanowi dobrą praktykę i jest wystarczająco solidne, aby wychwycić wszystkie sytuacje, w których klient rezygnuje z komunikacji dwustronnej? A może usługa powinna obsługiwać wyjątki napotkane w momencie, w którym próbuje się komunikować z klientem i czynić operację czyszczenia?
  2. Oprócz zwykłego anulowania subskrypcji obsługi klienta połączenia przychodzącego, czy należy przeprowadzić dalsze czyszczenie, szczególnie w przypadku usterki?

This question stwarza podobne pytanie, ale ostatecznie nie dostarcza odpowiedzi na przypadkach poza klienta wywołującego subskrybować i/lub wypisać

Dzięki

Odpowiedz

8

Zrobiłem kilka testów, w których załączałem programy obsługi do zamkniętych i uszkodzonych zdarzeń w kanale zwrotnym, a następnie zabiłem klienta w punkcie tuż przed wywołaniem wywołania zwrotnego przez serwer. Podczas każdej próby zdarzenie Closed/Faulted zostało uruchomione natychmiast i zanim serwer spróbował wywołać wywołanie zwrotne. Mimo to, wciąż mam wywołanie zwrotne zawinięte w blok try-catch, ponieważ zniszczenie kanału klienta mogło wystąpić, gdy inny wątek wchodził do wywołania zwrotnego.

Jedynym koniecznym czyszczeniem było usunięcie odwołania do kanału zwrotnego. WCF i śmieciarz wykonają resztę.

2

Obchodzenie tych wydarzeń będzie utrzymywać swoją listę subskrybentów zsynchronizowanych. Jest rzeczywiście wystarczająco solidny. Pamiętaj tylko, że jeśli klient upuszcza podczas transmisji wiadomości, możesz otrzymać wyjątek przed uruchomieniem tych zdarzeń, więc bądź gotów zignorować je, aby zdarzenia mogły zostać wyczyszczone.

Z wyjątkiem usuwania klienta z listy subskrybentów, dodatkowe czyszczenie zależy całkowicie od aplikacji (np. Zwalnianie zasobów uzyskanych po podłączeniu klienta). Nie jestem świadomy żadnych innych porządków, które są wymagane.

Powiązane problemy