Technology Experience
.NET World

Azure Service Bus Relay, ovvero come esporre un WCF on-premise sul cloud

L’Azure Service Bus Relay (d’ora in poi ASBR) è il servizio messo a disposizione da Azure che ho scoperto più di recente, grazie al mio capo Gabriele Gaggi che me ne ha parlato chiedendomi di studiarlo & provarlo, perchè ci sarebbe stato molto utile in uno scenario che dobbiamo risolvere. Effettivamente l’ASBR è molto molto interessante, e risolve un compito piuttosto ostico, con estrema eleganza e soprattutto relativamente poco lavoro per noi sviluppatori.

A che serve? Semplificando di molto, l’ASBR permette di esporre un servizio Windows Communication Foundation (WCF), che gira on-premise in una rete LAN aziendale, direttamente sul cloud pubblico. Senza bisogno di impazzire con l’apertura di porte sul firewall, di stabilire regole di routing, o più in generale di andare ad apportare cambiamenti pericolosi nell’infrastruttura di rete aziendale.

La tipica domanda che mi viene posta è la seguente: ma se ti serve un WCF sul cloud, perchè non ne fai direttamente il deploy su Azure? Se mi fate questa domanda è perchè siete troppo web-oriented-only, e questo è decisamente male. Spesso e volentieri sono costretto ad avere un servizio WCF che gira on-premise, per diverse ragioni: per motivi di policy, e soprattutto perchè il più delle volte questo servizio deve dialogare con una periferica via USB. Di conseguenza, sono obbligato ad avere un PC server che comunica con la periferica tramite WCF (hostato in un Windows Service, per esempio), che assolve a tutta una serie di compiti (logging, monitoraggio e controllo della periferica, reportistica, etc. etc.); nel mondo moderno, però, il web non è da trascurare, e quindi questo WCF deve anche essere reso disponibile sul cloud.
ASBR serve proprio a questo, con il minor sforzo possibile.

Il tutto è contenuto in questo articolo, che ho seguito passo-passo per ottenere il risultato finale.

1) Creare un service bus su Azure
Il primo step da completare è quello di creare un service bus su Azure. Nel momento in cui vi scrivo, questa operazione non è ancora possibile con l’Azure Portal nuovo, ma dovete accedere a quello classico, disponibile all’indirizzo https://manage.windowsazure.com.

image

Nel mio caso ne ho creato uno chiamato exposedwcf. Da questo servizio bus dovete recuperare il nome (che in realtà avete scelto voi) e la primary key (chiave primaria).

2) Creare il server WCF
Ovviamente, dovete innanzitutto avere un servizio WCF che gira sul PC, allo scopo di pubblicarlo sul cloud. Come esempio, potete vedere quello che ho pubblicato sul GitHub di Brain-Sys all’indirizzo https://github.com/Brain-Sys/ASBR_Server.

Si tratta di un banale WCF hostato in una Console Application.
Il servizio WCF prevede la seguente interfaccia:

namespace ASBR_Server
{
    using System.ServiceModel;

    [ServiceContract(Namespace = "urn:ps")]
    interface IProblemSolver
    {
        [OperationContract]
        int AddNumbers(int a, int b);
    }

    interface IProblemSolverChannel :
        IProblemSolver, IClientChannel { }
}

L’interfaccia è IProblemSolver, ed espone un unico metodo AddNumbers che, con molta fantasia, prende due integer e restituisce la loro somma. L’implementazione è estremamente banale.

static void Main(string[] args)
{
    var sh = new ServiceHost(typeof(ProblemSolver));
    sh.Open();
    Console.WriteLine("Server started!!!");
    Console.WriteLine("Press ENTER to close");
    Console.ReadLine();
    sh.Close();
}

Viene create un’istanza di ServiceHost, al quale viene passata in input l’interfaccia del servizio. Poi il servizio parte, con il classico Console.ReadLine() per fare in modo che il servizio rimanga in attesa (ovviamente questo vale per una Console Application).

Da notare che nel file app.config il servizio WCF ha due endpoint. Il primo è associato ad un binding di tipo netTcpBinding, il cui url è net.tcp://localhost:9358/solver, ed è l’indirizzo che viene esposto ovviamente all’interno della LAN sulla rete on-premise. Il secondo endpoint invece utilizza un binding di tipo netTcpRelayBinding, il cui url è sb://exposedwcf.servicebus.windows.net/solver. Notare il protocollo sb://, che indica appunto l’utilizzo del service bus su Azure. Questo è l’url al quale dovranno puntare i client che raggiungeranno il servizio da remoto, e quindi al di fuori della rete aziendale, accedendoci da Azure.

Fate riferimento al repository GitHub indicato prima per tutti i dettagli del caso.

3) Creare il client WCF


L’altra faccia della medaglia è il client. Anch’esso è una banale applicazione di tipo Console.

Fate riferimento al repository https://github.com/Brain-Sys/ASBR_Client su GitHub.

In questo progetto abbiamo ripetuto la definizione dell’interfaccia IProblemSolver vista prima. Il file Program.cs fa una cosa molto molto banale.

static void Main(string[] args)
{
    Random rnd = new Random((int)DateTime.Now.Ticks);
    var cf = new ChannelFactory<IProblemSolverChannel>("solver");
    var ch = cf.CreateChannel();

    for (int i = 0; i < 1000; i++)
    {
        int a = rnd.Next(1, 100);
        int b = rnd.Next(1, 100);
        Console.WriteLine("Richiesta " + (i + 1));
        Console.WriteLine(ch.AddNumbers(a, b));
    }

    Console.ReadKey();
}

Viene aperto un canale di comunicazione verso il servizio WCF (notare che la configurazione del servizio WCF è contenuta nel file App.config, che qui non si vede). Poi viene invocato per 1.000 volte il metodo AddNumbers(a, b), chiedendo al servizio WCF di risolvere la somma e di restituirci il risultato.

Et voilà, il gioco è fatto! Il client si connette al servizio WCF via Azure. Questo significa che a costo zero (ovvero: senza toccare nulla del nostro codice), possiamo prendere un servizio WCF già pronto ed esporlo sul cloud, semplicemente aggiungendo un nuovo endpoint tramite l’ASBR.

Anche in questo caso, date un’occhiata al repository GitHub ASBR_Client indicato prima.

4) Conclusione


E’ semplice fare una prova del nove. Lanciate il servizio WCF server sul vostro PC, che si metterà in attesa di un qualche client che si connetta. Compilate il client, passatelo ad un collega o a qualcuno che sta dall’altra parte del mondo, o comunque qualcuno al di fuori della vostra LAN, e chiedetegli di lanciare il client. Il suo client raggiungerà il servizio WCF via Azure: il suo client effettuerà 1.000 richieste di AddNumbers(), che verranno risolte dal WCF che gira sul vostro PC. La stessa cosa la potete anche fare voi in locale (server & client sullo stesso PC, per capirci), ma ovviamente non avete la percezione che il WCF sia effettivamente esposto sul Web.

Ulteriori informazioni sull’Azure Service Bus sono raggiungibili qui.

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.