Udostępnij za pośrednictwem


Sesje, tworzenie wystąpień i współbieżność

Sesja jest korelacją wszystkich komunikatów wysyłanych między dwoma punktami końcowymi. Instancing odnosi się do kontrolowania okresu istnienia obiektów usługi zdefiniowanej przez użytkownika i ich powiązanych InstanceContext obiektów. Współbieżność to termin określony dla kontroli liczby wątków wykonywanych w InstanceContext tym samym czasie.

W tym temacie opisano te ustawienia, sposób ich używania oraz różne interakcje między nimi.

Sesje

Gdy kontrakt usługi ustawia ServiceContractAttribute.SessionMode właściwość na SessionMode.Required, oznacza to, że wszystkie wywołania (czyli podstawowe wymiany komunikatów, które obsługują połączenia) muszą być częścią tej samej konwersacji. Jeśli kontrakt określa, że zezwala na sesje, ale nie wymaga tego, klienci mogą nawiązać połączenie i ustanowić sesję lub nie. Jeśli sesja zakończy się, a komunikat zostanie wysłany przez ten sam kanał oparty na sesji, zgłaszany jest wyjątek.

Sesje programu WCF mają następujące główne funkcje koncepcyjne:

  • Są one jawnie inicjowane i przerywane przez aplikację wywołującą.

  • Komunikaty dostarczane podczas sesji są przetwarzane w kolejności, w której są odbierane.

  • Sesje skorelują grupę wiadomości z konwersacją. Znaczenie tej korelacji jest abstrakcją. Na przykład jeden kanał oparty na sesji może korelować komunikaty na podstawie udostępnionego połączenia sieciowego, podczas gdy inny kanał oparty na sesji może skorelować komunikaty na podstawie tagu udostępnionego w treści komunikatu. Funkcje, które mogą pochodzić z sesji, zależą od charakteru korelacji.

  • Brak ogólnego magazynu danych skojarzonego z sesją programu WCF.

Jeśli znasz klasę System.Web.SessionState.HttpSessionState w aplikacjach ASP.NET i udostępnianą przez nią funkcjonalność, możesz zauważyć następujące różnice między sesjami tego rodzaju i sesjami WCF:

  • ASP.NET sesje są zawsze inicjowane przez serwer.

  • ASP.NET sesje są niejawnie nieurządkowane.

  • ASP.NET sesje zapewniają ogólny mechanizm przechowywania danych między żądaniami.

Aplikacje klienckie i aplikacje usług współdziałają z sesjami na różne sposoby. Aplikacje klienckie inicjują sesje, a następnie odbierają i przetwarzają komunikaty wysyłane w ramach sesji. Aplikacje usług mogą używać sesji jako punktu rozszerzalności, aby dodać dodatkowe zachowanie. Odbywa się to przez bezpośrednie działanie z dostawcą InstanceContext kontekstu wystąpienia niestandardowego lub implementowanie go.

Tworzenie wystąpienia

Zachowanie instancingu (ustawione za pomocą ServiceBehaviorAttribute.InstanceContextMode właściwości) kontroluje sposób tworzenia obiektu InstanceContext w odpowiedzi na przychodzące komunikaty. Domyślnie każda z nich InstanceContext jest skojarzona z jednym obiektem usługi zdefiniowanej przez użytkownika, więc (w domyślnym przypadku) ustawienie InstanceContextMode właściwości kontroluje również instancing obiektów usługi zdefiniowanej przez użytkownika. Wyliczenie InstanceContextMode definiuje tryby stancingu.

Dostępne są następujące tryby stancingu:

  • PerCall: dla każdego żądania klienta jest tworzony nowy InstanceContext (i w związku z tym obiekt usługi).

  • PerSession: Nowy InstanceContext (i dlatego obiekt usługi) jest tworzony dla każdej nowej sesji klienta i utrzymywany przez okres istnienia tej sesji (wymaga to powiązania obsługującego sesje).

  • Single: pojedynczy InstanceContext (i dlatego obiekt usługi) obsługuje wszystkie żądania klientów przez cały okres istnienia aplikacji.

Poniższy przykład kodu przedstawia wartość domyślną InstanceContextMode , PerSession która jest jawnie ustawiana w klasie usługi.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorInstance
{
    ...  
}  

I podczas gdy ServiceBehaviorAttribute.InstanceContextMode właściwość kontroluje, jak często InstanceContext jest zwalniany, OperationBehaviorAttribute.ReleaseInstanceMode właściwość i ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete kontroluje, kiedy obiekt usługi jest zwalniany.

Dobrze znane usługi singleton

Jedna odmiana obiektów usługi pojedynczego wystąpienia jest czasami przydatna: można samodzielnie utworzyć obiekt usługi i utworzyć hosta usługi przy użyciu tego obiektu. W tym celu należy również ustawić ServiceBehaviorAttribute.InstanceContextMode właściwość na Single lub zgłaszany jest wyjątek po otwarciu hosta usługi.

Użyj konstruktora ServiceHost(Object, Uri[]) , aby utworzyć taką usługę. Stanowi alternatywę dla implementacji niestandardowej System.ServiceModel.Dispatcher.IInstanceContextInitializer , gdy chcesz udostępnić określone wystąpienie obiektu do użycia przez pojedynczą usługę. Tego przeciążenia można użyć, gdy typ implementacji usługi jest trudny do skonstruowania (na przykład jeśli nie implementuje bez parametrów publicznego konstruktora).

Należy pamiętać, że gdy obiekt jest dostarczany do tego konstruktora, niektóre funkcje związane z zachowaniem instancingu programu Windows Communication Foundation (WCF) działają inaczej. Na przykład wywołanie InstanceContext.ReleaseServiceInstance nie ma wpływu, gdy zostanie udostępnione pojedyncze wystąpienie obiektu. Podobnie każdy inny mechanizm wydawania wystąpień jest ignorowany. Właściwość ServiceHost zawsze zachowuje się tak, jakby OperationBehaviorAttribute.ReleaseInstanceMode właściwość jest ustawiona ReleaseInstanceMode.None dla wszystkich operacji.

Udostępnianie obiektów InstanceContext

Możesz również kontrolować, który kanał sesji lub wywołanie jest skojarzone z tym InstanceContext obiektem, wykonując to skojarzenie samodzielnie.

Współbieżność

Współbieżność to kontrola liczby wątków aktywnych w obiekcie InstanceContext w dowolnym momencie. Jest to kontrolowane za pomocą ServiceBehaviorAttribute.ConcurrencyMode wyliczenia ConcurrencyMode .

Dostępne są następujące trzy tryby współbieżności:

  • Single: Każdy kontekst wystąpienia może mieć maksymalnie jeden wątek przetwarzania komunikatów w kontekście wystąpienia w danym momencie. Inne wątki, które chcą używać tego samego kontekstu wystąpienia, muszą blokować, dopóki oryginalny wątek nie zakończy kontekstu wystąpienia.

  • Multiple: Każde wystąpienie usługi może mieć wiele wątków przetwarzania komunikatów jednocześnie. Implementacja usługi musi być bezpieczna wątkowo, aby korzystać z tego trybu współbieżności.

  • Reentrant: każde wystąpienie usługi przetwarza jeden komunikat naraz, ale akceptuje wywołania operacji ponownego uczestnika. Usługa akceptuje te wywołania tylko podczas wywoływania za pośrednictwem obiektu klienta WCF.

Uwaga

Zrozumienie i opracowanie kodu, który bezpiecznie używa więcej niż jednego wątku, może być trudne do pomyślnego zapisu. Przed użyciem Multiple wartości lub Reentrant upewnij się, że usługa została prawidłowo zaprojektowana dla tych trybów. Aby uzyskać więcej informacji, zobacz ConcurrencyMode.

Użycie współbieżności jest związane z trybem stancingu. W PerCall stancingu współbieżność nie jest istotne, ponieważ każdy komunikat jest przetwarzany przez nowy InstanceContext i dlatego nigdy więcej niż jeden wątek nie jest aktywny w obiekcie InstanceContext.

W poniższym przykładzie kodu pokazano, jak ustawić ConcurrencyMode właściwość na Multiple.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
    ...  
}  

Interakcje sesji z Ustawienia InstanceContext

Sesje i InstanceContext interakcja w zależności od kombinacji wartości SessionMode wyliczenia w kontrakcie i ServiceBehaviorAttribute.InstanceContextMode właściwości implementacji usługi, która kontroluje skojarzenie między kanałami i określonymi obiektami usługi.

W poniższej tabeli przedstawiono wynik przychodzącego kanału obsługującego sesje lub nieobsługiwane sesje, biorąc pod uwagę kombinację wartości ServiceContractAttribute.SessionMode właściwości i ServiceBehaviorAttribute.InstanceContextMode właściwości usługi.

Wartość InstanceContextMode Required Allowed NotAllowed
Percall - Zachowanie z kanałem sesji: sesja i InstanceContext dla każdego wywołania.
— Zachowanie z kanałem bez sesji: zgłaszany jest wyjątek.
- Zachowanie z kanałem sesji: sesja i InstanceContext dla każdego wywołania.
- Zachowanie z kanałem bez sesji: an InstanceContext dla każdego wywołania.
- Zachowanie z kanałem sesji: zgłaszany jest wyjątek.
- Zachowanie z kanałem bez sesji: an InstanceContext dla każdego wywołania.
Persession - Zachowanie z kanałem sesji: sesja i InstanceContext dla każdego kanału.
— Zachowanie z kanałem bez sesji: zgłaszany jest wyjątek.
- Zachowanie z kanałem sesji: sesja i InstanceContext dla każdego kanału.
- Zachowanie z kanałem bez sesji: an InstanceContext dla każdego wywołania.
- Zachowanie z kanałem sesji: zgłaszany jest wyjątek.
- Zachowanie z kanałem bez sesji: an InstanceContext dla każdego wywołania.
Pojedynczy - Zachowanie z kanałem sesji: sesja i jedna InstanceContext dla wszystkich wywołań.
— Zachowanie z kanałem bez sesji: zgłaszany jest wyjątek.
- Zachowanie z kanałem sesji: sesja i InstanceContext dla utworzonego lub określonego przez użytkownika pojedynczego.
- Zachowanie z kanałem bez sesji: an InstanceContext dla utworzonego lub określonego przez użytkownika pojedynczego.
- Zachowanie z kanałem sesji: zgłaszany jest wyjątek.
- Zachowanie z kanałem bez sesji: dla InstanceContext każdego utworzonego pojedynczego lub pojedynczego określonego przez użytkownika.

Zobacz też