Windows Communication Foundation to technologia, którą świat ujrzał z .NET Framework 3.0 jako odpowiedź na potrzebę budowania rozproszonych systemów, które MS zaczął marketingowo nazywać "Connected Systems". Podczas tworzenia aplikacji rozproszonych ważne jest, aby umożliwić komunikowanie się systemów napisanych w różnych technologiach. Stąd pomysł serwisów jako jednostek udostępniających pewne funkcjonalności poprzez przesyłanie ustandaryzowanych wiadomości.
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.