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:
- 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
- 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