piątek, 15 kwietnia 2011

70-513 - Odcinek 2 - Message Exchange Patterns czyli typy komunikacji w WCF

W niniejszym poście postaram się opisać dostępne w Windows Communication Foundation rodzaje komunikacji.
Dzięki WCF, komunikacja między aplikacjami klienckimi a serwisem może zachodzić na kilka różnych sposobów. WCF dostarcza tzw: "Message Exchange Patterns (MEP)", który opisuje protokół wymiany wiadomości. MEP określa, że w WCF komunikacja może zachodzić z użyciem trzech następujących wzorców:
  • Request/Response (żądanie/odpowiedź)
  • OneWay
  • Duplex 


    Request/Response
    Ten wzorzec jest najczęściej wykorzystywanym przy tworzeniu serwisu WCF, również dlatego iż można go uznać za domyślny wzorzec komunikacji. Po pierwsze dlatego, że implementacja komunikacji dwustronnej (duplex) wiąże się z dodatkową konfiguracją, po drugie, wszystkie metody domyślnie mają parametr IsOneWay ustawione na false, sprawiając, że wzorzec OneWay nie ma tutaj prawa bytu.
    Typowa deklaracja serwisu z wykorzystaniem wzorca Request/Response wygląda następująco:

    [ServiceContract]
    public interface ITestService
    {
      [OperationContract]
      public void DeleteUser(int userID);

      [OperationContract]
      public User GetUserByID(int userID);
    }
    Ciekawostką jest, iż wszystkie rodzaje "bindingów" z wyjątkiem tych opartych na MSMQ (Micorosft Message Queue) wspierają wzorec Request/Response.

    OneWay
    OneWay jest przykładem komunikacji jednostronnej. Metody oznaczone tym atrybutem nie będą zwracały żadnej odpowiedzi z serwisu do aplikacji klienckiej. Można to wyobrazić sobie w ten sposób, że klient wysyła żądanie i nie interesuje go odpowiedź z serwisu. W przypadku gdy metoda wywoływana jest udekorowana atrybutem OneWay=true, odpowiedź nigdy nie zostanie zwrócona. Decydując się na ten rodzaj komunikacji, musimy wziąć pod uwagę następujące fakty:
    • w tym wzorcu nie mogą być używane FaultContracts. Jest to logiczne ponieważ zwracanie błędów SOAP wiąże się z komunikacją dwukierunkową.
    • Czasami może być niebezpieczne wysyłania wiadomości do serwisu i nie mieć pewności, że wiadomość została poprawie dostarczona i przetworzona. OneWay binding wspiera kolejnowanie dostarczania wiadomości
    • W przypadku gdy chcemy kolejkować dostarczanie wiadomości, naszym jedynym wyborem będzie wybór komunikacji OneWay
    • wiadomości wysyłane nie są asynchroniczne (tak jak mogłoby się wydawać zgodnie z zasadą wyślij-i-zapomnij (send-and-forget). Oznacza to, że sam proces wysyłania wiadomości "zablokuje" nam możliwość wykonywania innych operacji w tym czasie 
    W przypadku gdy chcemy aby nasza metoda serwisu posiadała komunikację jednostronną, musi ona być udekorowana w następujący sposób:

    [OperationContract(IsOneWay=true)]
    public void SomeOperation(int someIntPar);


    Duplex
    Jest to typ komunikacji dwustronnej, który może być użyty w jednym z dwóch przypadków:
    1. Klient wysyła wiadomość do serwisu aby zainicjować proces stosunkowo długo trwający (long-running process) i jednocześnie wymaga stałego, periodycznego powiadamiania z serwisu o stanie procesu jak również powiadomienia o zakończeniu działania procesu
    2. Klient musi być w stanie odebrać od serwisu wiadomości niezainicjonowane przez klienta
    W przypadku wyboru tego typu komunikacji, musimy stworzyć dodatkowy kontrakt - "CallbackContract", przypisując go naszemu serwisowi. Zatem nasz serwis może wyglądać następująco:
    Określamy nasz CallbackContract:
    [ServiceContract]
    public interface IGreetingCallback
    {
      [OperationContract(IsOneWay=true)]
      void ShowGreeting(string greeting);
     

    Przypisujemy CallbackContract w naszym serwisie
    [ServiceContract(CallbackContract=typeof(IGreetingCallback))]
    public interface IGreetingService
    {
      [OperationContract(IsOneWay=true)]
      public void RequestGreeting(string name);

    }
    W implementacji serwisu w metodzie, która nas interesuje wywołujemy odpowiednią metodę CallbackContract 
    [ServiceBahavior(InstanceContextMode=InstanceContextMode.PerSession)]
    public class GreetingService : IGreetingService
    {
      public void RequestGreeting(string name)
      {
        IGreetingCallback callback = OperationContext.Current.GetCallbackChannel();
        callback.ShowGreeting("Hello " +name);
      }
    }

    To by było na tyle z teoretycznych rzeczy odnośnie rodzajów komunikacji w WCF'ie. W kolejnych postach postaram się zaprezentować praktyczne przykłady zastosowania wyżej wymienionych wzorców.

    Brak komentarzy:

    Prześlij komentarz