Azure AppFabric - Multicasting  

Udostępnij na: Facebook

Autor: Piotr Zieliński

Opublikowano: 2011-03-09

Wprowadzenie

Windows Azure AppFabric umożliwia stworzenie architektury, w której komunikacja jest oparta na broadcastingu. Każdy klient oprócz funkcji nadawcy pełni również rolę odbiorcy. Po wysłaniu komunikatu do ServiceBus zostanie on automatycznie rozesłany do wszystkich podłączonych klientów.

Implementacja

Kluczowym elementem w implementacji jest wybór odpowiedniego wiązania (bindingu), a mianowicie netEventRelayBinding. Pozostała część kodu nieznacznie tylko będzie się różnić od zwykłego wyeksponowania usługi WCF za pomocą Service Bus. W przypadku multicastingu każdy klient eksponuje usługę WCF oraz jednocześnie tworzy kanał komunikacji w celu wysyłania wiadomości. Stwórzmy więc przykładową aplikację klient\serwer, która rozsyła komunikat (echo) do wszystkich innych usług:

1.     Do utworzonego projektu (np. Console) dodajemy referencje do bibliotek System.ServiceModel.dll oraz Microsoft.ServiceBus.dll.

2.     Tworzymy kontrakt (najlepiej we współdzielonej, osobnej bibliotece) oraz jego implementację:

 

[ServiceContract]

    public interface IEchoService

    {

        [OperationContract(IsOneWay = true)]

        void Echo(string text);        

    } 

    public class EchoService : IEchoService

    {

        #region IEchoService Members



        public void Echo(string text)

        {

            Console.WriteLine(string.Format("Echoing: {0}", text));

        }



        #endregion

    }

Warto zwrócić uwagę na atrybut OperationContract – wszystkie metody multicast muszą być jednokierunkowe. WCF odbiera wtedy taką wiadomość  i rozsyła dalej, nie zwracając żadnej informacji zwrotnej.

3.     Konfigurujemy protokoły w pliku app.config:

 

<system.serviceModel>

    <client>

      <endpoint name="RelayEndpoint"

                contract="EchoProject.IEchoService"

                binding="netEventRelayBinding"/>

    </client>

    <services>

      <service name="EchoProject.EchoService">

        <endpoint address="" binding="netEventRelayBinding" contract="EchoProject.IEchoService">

        </endpoint>

      </service>

    </services>

  </system.serviceModel>

Konfigurujemy zarówno klienta, jak i serwer. Ponadto w przypadku multicastingu wykorzystujemy wiązanie netEventRelayBinding.

4.     Standardowo hostujemy usługę – implementacja niczym się nie różni od hostingu innych WCF (część serwerowa):

 

TransportClientEndpointBehavior relayCredentials = new TransportClientEndpointBehavior();            

relayCredentials.CredentialType = TransportClientCredentialType.SharedSecret;

relayCredentials.Credentials.SharedSecret.IssuerName = "";

relayCredentials.Credentials.SharedSecret.IssuerSecret = "";

Uri serviceAddress = ServiceBusEnvironment.CreateServiceUri("sb", "msdnpoland", "EchoService");



System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(EchoProject.EchoService), serviceAddress);

host.Description.Endpoints[0].Behaviors.Add(relayCredentials);

host.Open();

5.     Przed implementacją części klienckiej należy stworzyć klasę odpowiedzialną za komunikację z WCF:

public interface IEchoChannel : EchoProject.IEchoService, IClientChannel { }

6.     Tworzymy odpowiedni kanał i zaczynamy wywoływać operacje na usłudze (część kliencka):

ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceAddress));            

channelFactory.Endpoint.Behaviors.Add(relayCredentials);

IEchoChannel channel = channelFactory.CreateChannel();

channel.Open();



while (true)

{

    string text = Console.ReadLine();

channel.Echo(text);

}

I to już wszystko! Warto włączyć kilka instancji aplikacji i przekonać się, że wywołując metodę WCF na jednej z nich, wszystkie zahostowane usługi WCF odbiorą stosowny komunikat i wywołają metodę!

Zakończenie

Implementacja aplikacji opartej na multicastingu polega na stworzeniu aplikacji, która pełni funkcję zarówno klienta, jak i serwera. Po stworzeniu aplikacji składającej się z klienta i serwera wystarczy skonfigurować prawidłowy binding, a mianowicie netEventRelayBinding. Oczywiście część kliencka i serwerowa może zostać rozdzielona pomiędzy całkowicie różne aplikacje. Na przykład klientem może być aplikacja webowa, natomiast usługi WCF mogą zostać ulokowane w poszczególnych oddziałach danej firmy.


          

Piotr Zieliński

Absolwent informatyki o specjalizacji inżynieria oprogramowania Uniwersytetu Zielonogórskiego. Posiada szereg certyfikatów z technologii Microsoft (MCP, MCTS, MCPD). W 2011 roku wyróżniony nagrodą MVP w kategorii Visual C#. Aktualnie pracuje w General Electric pisząc oprogramowanie wykorzystywane w monitorowaniu transformatorów . Platformę .NET zna od wersji 1.1 – wcześniej wykorzystywał głównie MFC oraz C++ Builder. Interesuje się wieloma technologiami m.in. ASP.NET MVC, WPF, PRISM, WCF, WCF Data Services, WWF, Azure, Silverlight, WCF RIA Services, XNA, Entity Framework, nHibernate. Oprócz czystych technologii zajmuje się również wzorcami projektowymi, bezpieczeństwem aplikacji webowych i testowaniem oprogramowania od strony programisty. W wolnych chwilach prowadzi blog o .NET i tzw. patterns & practices.