Dominują dwa wzorce, SOAP i REST.
SOAP (Simple Object Access Protocol) - wiadomości wysyłane są w formacie XML i WS-* protocols. Wspiera wiele protokołów transportowych np. HTTP, TCP, MSMQ.
REST (Representational State Transfer) - różne formaty wiadomości (XML, coraz częściej JSON), protokół transportowy HTTP, paradygmat ukierunkowany na adresowanie, modyfikowanie i odczytywanie zasobów.
WCF wprowadza unifikację, umożliwiając wymianę wiadomości po różnych protokołach, w różnych formatach, wzorcach.
Większość funkcjonalności WCF zawarte jest w System.ServiceModel.dll. Najprościej filozofię WCF oddaje zdanie: serwisy wystawiają swoje funkcjonalności poprzez endpointy, natomiast klienci konsumują je poprzez kanały. WCF-owe endpointy składają się z trzech składowych ABC definiujące podstawowe pojęcia (Address - gdzie?, Binding - jak?, Contract - co?).
Tworzenie najprostszej aplikacji WCF:
Pierwszy projekt to serwisy WCF.
[DataContract] public class Name { [DataMember] public string First { get; set; } [DataMember] public string Last { get; set; } } [ServiceContract] public interface IMyFirstService { [OperationContract] string SayHello(Name name); } public class MyFirstService : IMyFirstService { public string SayHello(Name name) { return string.Format("Hello, {0} {1}", name.First, name.Last); } }
Klasa Name będzie przesyłaną wiadomością, natomiast oznaczenie interfejsu przez atrybuty definiuje, jakie operacje chcemy wystawić na zewnątrz. Kolejne zmiany nanosimy w pliku App.config.Wystawiamy jeden serwis dostępny pod trzema endpointami wykorzystującymi różne protokoły transportowe.
<services> <service name="WcfEssentials.MyFirstService"> <host> <baseAddresses> <add baseAddress="http://localhost:8080/helloworld/" /> </baseAddresses> </host> <endpoint address="ws" binding="wsHttpBinding" contract="WcfEssentials.IMyFirstService" /> <endpoint address="basic" binding="basicHttpBinding" contract="WcfEssentials.IMyFirstService" /> <endpoint address="net.tcp://localhost:8081/helloworld/" binding="netTcpBinding" contract="WcfEssentials.IMyFirstService" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>
Uruchomienie aplikacji spowoduje pojawienie się okna, w którym możemy testować nasze endpointy.
Jeżeli chcemy wykorzystać nasz serwis w kodzie, dodajemy osobny projekt, np. aplikację konsolową. Następnie musimy dodać referencję do serwisów WCF. Klikamy prawym przyciskiem myszy i wybieramy Add Service Reference....
Strona kliencka pobierze metadane i utworzy obiekty proxy, którymi będziemy mogli się łączyć do stworzonych wcześniej serwisów. W pliku app.config automatycznie wygenerują się bindingi dla strony klienckiej, gdzie każdy endpoint otrzyma swoją nazwę. Wywołanie serwisu w kodzie C# jest bardzo proste.
using (var client = new MyFirstServiceClient("NetTcpBinding_IMyFirstService")) { var name = new Name() { First = "Tom", Last = "Smith" }; Console.WriteLine(client.SayHello(name)); Console.Read(); }
Jako parametr konstruktora podajemy wygenerowaną przez VS nazwę serwisu.
Brak komentarzy:
Prześlij komentarz