BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

[WCF REST#1] Implementazione di un semplice servizio RESTful

Introduzione

Ormai diverse settimane fa abbiamo parlato di cosa è REST. Oggi vediamo come sviluppare un primo, semplice servizio con WCF.

Il contratto di un servizio, come ormai sappiamo, in WCF viene tradotto con la definizione di una interfaccia marcata con gli attributi ServiceContract ed OperationContract:

  1: [ServiceContract(Namespace = "urn:MyBookNamespace")]
  2: public interface IBookService
  3: {
  4:     [OperationContract]
  5:     Book ReadBook(string bookId);
  6: }

L'implementazione dell'interfaccia può essere quindi simile a questa:

  1: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  2: public class BookService : IBookService
  3: {
  4:     public Book ReadBook(string bookId)
  5:     {
  6:         return BookDB.Read(bookId);
  7:     }
  8: }

Notate l'attributo [WebGet]? L'attributo ci consente di definire il metodo per la ricezione di richieste con il verbo GET HTTP.

Il behavior WebHttpBehavior

Da solo, però, in realtà non ha alcun effetto sul servizio. Dobbiamo definire l'utilizzo del behavior EnableWebScript:

  1: <endpointBehaviors>
  2:   <behavior name="BookService_RESTBehavior">
  3:     <enableWebScript/>
  4:   </behavior>
  5: </endpointBehaviors>

Il behavior WebScriptEnablingBehavior si occupa di esporre il servizio attraverso degli script javascript per abilitare la creazione di proxy client da pagine web. Vedremo infatti la creazione di un endpoint costituito dall'indirizzo del servizio più il suffisso /js. Nel nostro caso il servizio produrrà un js simile a questo:

image

Definiamo il binding

Per completare il nostro servizio, definiamo il binding da utilizzare. Con il .NET Framework 3.5 è stato introdotto il WebHttpBinding:

  1: <bindings>
  2:   <webHttpBinding>
  3:     <binding name="BookServiceWebBinding">
  4:       <security mode="None"/>
  5:     </binding>
  6:   </webHttpBinding>
  7: </bindings>

Si tratta di un binding che funziona esclusivamente con il protocollo http, come è facile intuire, e si occupa principalmente di configurare il trasporto (HttpTransportBindingElement) per il ManualAddressing a true e la versione del messaggio (MessageVersion) su None per il WebMessageEncodingBindingElement. Questo consente di non formattare il messaggio utilizzando SOAP.

Configurazione del servizio

Vediamo ora la configurazione dell'endpoint del nostro servizio ospitato su IIS:

  1: <services>
  2:   <service name="BookService" 
  3:            behaviorConfiguration="BookServiceBehavior">
  4:     <endpoint address="" 
  5:               binding="webHttpBinding" 
  6:               contract="IBookService"
  7:               behaviorConfiguration="BookService_RESTBehavior"
  8:               bindingConfiguration="BookServiceWebBinding"/>
  9:   </service>
 10: </services>

Il servizio così configurato è pronto per l'utilizzo da parte del client.

Il web client

Per utilizzare il servizio direttamente da una pagina web ASP.NET è sufficiente inserire un riferimento all'svc utilizzando il ServiceReference del controllo ScriptManager:

  1: <asp:ScriptManager ID="sm1" runat="server">
  2:     <Services>
  3:         <asp:ServiceReference Path="~/BookService.svc" />
  4:     </Services>
  5: </asp:ScriptManager>

Infine creiamo il nostro script che richiama il servizio. Ad esempio:

  1: function GetBook(bookId) {
  2:     var proxy = new MyBookNamespace.IBookService();
  3:     proxy.ReadBook(
  4:         bookId,
  5:         GetBook_OnSuccess,
  6:         GetBook_OnError,
  7:         null);
  8: }
  9: function GetBook_OnSuccess(result) {
 10:     alert("Titolo: " + result.Title + 
 11:         "\r\nDescrizione: " + result.Description);
 12: }
 13: function GetBook_OnError(result) {
 14:     alert("Error: " + result.Message);
 15: }

Possiamo quindi richiamare la funzione GetBook da qualsiasi punto della pagina. Semplice vero? Big Smile

Un ultima nota. Il namespace di esempio MyBookNamespace dichiarato nel contratto IBookService, viene letto ed utilizzato dal client, come potete vedere dalla riga 2.

Request/Response formats

I messaggi scambiati in questa modalità sono tutti in formato JSON (JavaScript Object Notation) un formato testuale per la rappresentazione dei dati molto semplice e fortemente integrato in javascript.

Analizziamo i messaggi con il Web Development Helper di Nikhil Kotari:

image

Oltre ai messaggi in formato JSON, notiamo nel titolo l'URL del servizio che viene invocato: http://localhost/RESTSimpleService/BookService.svc/ReadBook. ReadBook è semplicemente il nome del metodo che viene invocato in GET unito all'indirizzo base del servizio.

Conclusione

In questo post/articolo abbiamo visto come creare un semplice servizio RESTful per poi consumarlo in una pagina web utilizzando ASP.NET Ajax e javascript. Nei prossimi post mostrerò come utilizzare REST in maniera più approfondita e dettagliata, sfruttando tutti i verbi http per interrogare e modificare una risorsa web.

Posted: Mar 05 2009, 12:29 AM by Fabio.Cozzolino | with no comments
Filed under: ,