70-503: Instancing Modes

Ten artykuł pochodzi z serii przygotowań do egzaminu 70-503: Windows Communication Foundation.

WCF jest odpowiedzialny za wiązanie przychodzącego komunikatu do określonej instancji serwisu. Tryb wystąpienia (ang. instance mode) określa związek pomiędzy klientem a instancją serwisu (np. czy istniejąca instancja serwisu jest w stanie przetworzyć żądanie). Ta lekcja przedstawia, różne rodzaje możliwych wystąpień, sposób w jaki są tworzone i konsekwencje wyborów.

Dla InstanceContextMode dostępne są trzy wybory: per call mode, per session mode oraz singleton mode.

Co wywołanie

Domyślnym trybem jest PerCall, który utrzymuje asocjację jeden-do-jednego pomiędzy wywołaniami metod a instancjami serwera. Każde pojedyncze żądanie dostaje swoją własną kopię serwisu (obiektu serwisu). Klient wywołuje żądanie do serwisu poprzez obiekt proxy. Kiedy żądanie dochodzi do serwisu, host tworzy instancję serwisu. Obiekt ten jest następnie wywoływany w celu przetworzenia tego żądania. Kiedy zostanie ono już przetworzone a odpowiedź zwrócona do klienta, obiekt jest usuwany.

image

Jakkolwiek jest to metoda prosta w użyciu, nie oznacza to, że zawsze jest najlepsza. Ograniczony zasób (ang. scarce resource) to taki, który jest kosztowny u utworzeniu, lub ilość jego wystąpień jest ograniczona. Przykłady takich zasobów to pliki na dysku twardym komputera, połączenia do bazy danych, połączenia sieciowe, komunikacja przez porty. W takim wypadku tylko jedna instancja serwisu jest w stanie korzystać z zasobu, pozostałe muszą czekać na swoją kolej.

Tryb wystąpienia ustawiany jest po stronie serwisu. Poniższy przykład demonstruje sposób, w jaki można ustawić tryb na PerCall:

   1: [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
   2: class UpdateService : IUpdateService {...}

W tym trybie nie przekazywany jest stan aplikacji między wywołaniami metod. Ogólnie tryb ten najlepiej sprawdzi się kiedy indywidualne operacje są szybkie i nie składają się z żadnych zadań w tle, które kontynuują działanie nawet po obsłużeniu żądania.

Tryb sesji

image Tryb PerSession tworzy instancję dla każdego proxy klienta. W tym trybie WCF utrzymuje prywatną sesję pomiędzy klientem a określoną instancją serwisu. Klient, podczas pierwszego żądania do serwisu, otrzymuje instancję serwisu, która jest przeznaczona do obsłużenia żądań tego klienta. Wszystkie następujące potem żądania danego klienta są uznawane za część tej samej sesji, a wywołania są przetwarzane przez tę samą instancję serwisu.

Aby korzystać z tego trybu właściwość SessionMode musi zostać ustawiona na SessionMode.Required, co spowoduje poinformowanie klienta, że sesja ma być prowadzona:

   1: [ServiceContract(SessionMode = SessionMode.Required)]
   2: public interface IUpdateService
   3: {
   4: // ...
   5: }

Druga część konfiguracji to odpowiednie ustawienie InstanceContextMode:

   1: [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
   2: public class UpdateService : IUpdateService
   3: {
   4: // ...
   5: }

Instancja serwisu istnieje dopóki klient jej potrzebuje. Kiedy zakończy korzystanie ma możliwość zamknięcia proxy. Jeżeli tego nie zrobi sesja zakończy się automatycznie po dziesięciu minutach nieaktywności. Po tym czasie żądanie do serwisu spowoduje wyrzucenie wyjątku CommunicationObjectFaultedException. Przykład zmiany tej wartości dla netTcpBinding:

   1: NetTcpBinding binding = new NetTcpBinding();
   2: binding.ReliableSession.Enabled = true;
   3: binding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(60);

Przykład deklaratywny:

   1: <netTcpBinding>
   2:  <binding name="timeoutSession">
   3:   <reliableSession enabled="true" inactivityTimeout="01:00:00"/>
   4:  </binding>
   5: </netTcpBinding>

Uwaga: basicHttpBinding nie jest w stanie przekazać informacji związanej z sesją!

Tryb pojedynczego wystąpienia (Singleton)

W tym trybie tworzona jest tylko jedna instancja serwisu. Obsługuje ona każde żądanie, które dociera do serwisu. Instancja nie jest usuwana, trwa do wyłączenia procesu hostującego go. Tryb ten nie wymaga danych sesyjnych podczas przesyłania komunikatów. Przykład ustawienia trybu:

   1: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
   2: public class UpdateService : IUpdateService
   3: {
   4: // ...
   5: }

Najlepsze zastosowania tego trybu to takie, które modelują pojedynczy zasób – plik dziennika zdarzeń (log), komunikacja z pojedynczym robotem.

Podsumownie

Kiedy należy odpowiedzieć na pytanie, który tryb wystąpienia jest najlepszy, należy stwierdzić, że nie ma jednej poprawnej odpowiedzi. Wiele czynników musi zostać rozważonych, aby określić, “ten odpowiedni”. Wybór uzależniony jest od konkretnego zastosowania.

Tagi: , , , ,

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading


Eastgroup.pl na facebooku