Procedura: creare un servizio basato su REST per l'accesso a Service Bus
Windows Azure attualmente supporta due diversi tipi di applicazioni considerate come servizi basati su REST: un'applicazione di Service Bus tradizionale conforme al modello di programmazione Web e un'applicazione conforme a HTTP che utilizza un buffer dei messaggi.
-
Applicazione tradizionale
Per questo tipo di applicazione viene utilizzato il modello di programmazione di Windows Communication Foundation (WCF) di base. Viene infatti definito e creato un contratto del servizio, vengono utilizzati un binding e credenziali di sicurezza per la connessione a Service Bus e così via. L'aggiunta principale è costituita dal fatto che un'applicazione di Service Bus basata su REST utilizza un contratto del servizio in cui sono specificati i membri a cui vengono applicati gli attributi[OperationContract, WebGet]o[OperationContract, WebInvoke]. Questi comportamenti definiscono l'interfaccia come un'interfaccia REST e consentono a Service Bus di interagire con altre applicazioni di tipo REST. Nelle applicazioni è pertanto incluso codice aggiuntivo che consente loro di creare messaggi di tipo HTTP. Tutte queste applicazioni infine utilizzano il binding WebHttpRelayBinding. Per ulteriori informazioni, vedere Procedura: esporre un servizio Web basato su REST tramite Service Bus. Per un esempio esteso di un'applicazione di servizio basata su REST, vedere l'Esercitazione su REST per Service Bus, che si basa a sua volta sull'esempio WebHttp disponibile in Windows Azure SDK. -
Applicazioni che utilizzano un buffer dei messaggi
Il buffer dei messaggi è una nuova funzionalità di Service Bus che espone un'interfaccia REST a una posizione di buffer. Le applicazioni mittente possono utilizzare tale buffer per archiviare temporaneamente messaggi ed eventi come con qualsiasi altro buffer. Analogamente, le applicazioni client possono effettuare la sottoscrizione al buffer per ricevere i messaggi o gli eventi in esso archiviati. Poiché l'interfaccia viene esposta tramite Service Bus, è disponibile per qualsiasi applicazione sia in grado di connettersi a Internet. Dal momento che il buffer dei messaggi è un'interfaccia di tipo REST, è possibile connettersi a esso utilizzando applicazioni non WCF, ad esempio applicazioni JavaScript, Web browser e altri prodotti non Microsoft, inclusa la scrittura di servizi in JavaScript. Questa tecnologia tuttavia è molto diversa da un'applicazione di Service Bus tipica, pertanto a essa è dedicata una sezione a parte della documentazione. Per informazioni sulla creazione di applicazioni che interagiscono con il buffer dei messaggi, vedere Panoramica del buffer dei messaggi di Service Bus.
Visto che ai buffer dei messaggi è riservata una sezione della documentazione, in questo argomento verranno trattati principalmente i dettagli relativi alla creazione di un'applicazione di Service Bus di base che utilizzi lo standard REST. Il processo di hosting di un'applicazione di Service Bus basata su REST è molto simile all'hosting di un'applicazione di Service Bus standard. Le differenze principali riguardano il contratto e la configurazione, mentre l'effettivo processo di hosting è sostanzialmente lo stesso.
Per ospitare un'applicazione di servizio di Service Bus conforme allo standard REST
-
Creare il servizio utilizzando il modello standard come definito in Creazione di un servizio per Service Bus. In altri termini, definire e implementare un contratto del servizio, configurare e implementare l'host servizio e così via.
-
Quando si applica l'attributo OperationContractAttribute al contratto del servizio, assicurarsi di applicare gli attributi appropriati per identificare i membri basati su REST. Per ulteriori informazioni, vedere Procedura: esporre un servizio Web basato su REST tramite Service Bus.
Nel seguente codice di esempio viene mostrato come contrassegnare un membro dell'interfaccia come membro GET di tipo REST.
public interface IImageContract { [OperationContract, WebGet] Stream GetImage(); } -
Quando si implementa il contratto, impostare l'intestazione del tipo di contenuto appropriata per le risposte Web in uscita, in base alle esigenze dell'applicazione.
public ImageService() { this.bitmap = Image.FromFile(imageFileName); } public Stream GetImage() { MemoryStream stream = new MemoryStream(); this.bitmap.Save(stream, ImageFormat.Jpeg); stream.Position = 0; WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; return stream; }
-
-
Creare l'indirizzo per il servizio utilizzando il metodo CreateServiceUri:
string serviceNamespace = “myServiceNamespace” Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image"); -
Creare una nuova istanza di WebServiceHost.
WebServiceHost host = new WebServiceHost(typeof(ImageService), address);
La classe WebServiceHost deriva dalla classe ServiceHost e integra il modello di programmazione Web WCF. Facilita inoltre l'hosting dei servizi basati su REST. È consigliabile utilizzare WebServiceHost anziché ServiceHost nell'implementazione dell'applicazione di Service Bus basata su REST. Per ulteriori informazioni, vedere il modello di programmazione REST WCF nella documentazione relativa a WCF.
-
Specificare l'indirizzo, il binding e i contratti (a cui si fa riferimento anche come elementi "ABC", con l'acronimo delle parole inglesi "Address, Binding, Contracts") utilizzati dall'endpoint del servizio.
<services> <!-- Application Service --> <service name="Microsoft.ServiceBus.Samples.ImageService" behaviorConfiguration="default"> <endpoint name="RelayEndpoint" contract="Microsoft.ServiceBus.Samples.IImageContract" binding="webHttpRelayBinding" bindingConfiguration="default" behaviorConfiguration="sharedSecretClientCredentials" address="" /> </service>In questo caso gli elementi ABC sono collegati all'endpoint nel file App.config. Per informazioni sulla configurazione di un'applicazione, vedere Configurazione di un servizio WCF per la registrazione con Service Bus.
L'unico binding da utilizzare per un endpoint del servizio in un'applicazione di Service Bus basata su REST è WebHttpRelayBinding.
-
Se necessario, disabilitare l'autenticazione client.
<bindings> <!-- Application Binding --> <webHttpRelayBinding> <binding name="default"> <security relayClientAuthenticationType="None" /> </binding> </webHttpRelayBinding> </bindings>Per impostazione predefinita, il binding WebHttpRelayBinding richiede l'autenticazione client. In questo passaggio viene descritto come disabilitarla nell'elemento
<binding>nel file App.config, in modo che il client non debba presentare credenziali, ad esempio durante l'utilizzo di un browser. Per informazioni sull'autenticazione con Service Bus, vedere Sicurezza e autenticazione di una connessione a Service Bus. -
Definire la sicurezza per l'applicazione:
<behaviors> <endpointBehaviors> <behavior name="sharedSecretClientCredentials"> <transportClientEndpointBehavior credentialType="SharedSecret"> <clientCredentials> <sharedSecret issuerName="ISSUER_NAME" issuerSecret="ISSUER_SECRET" /> </clientCredentials> </transportClientEndpointBehavior> </behaviors>In questo esempio la sicurezza è definita nel file App.config. Per informazioni sulla sicurezza, vedere Sicurezza e autenticazione di una connessione a Service Bus.
-
Aprire il servizio con una chiamata a
WebServiceHost.Open:host.Open()
-
Al termine, chiudere l'host con
WebServiceHost.Close.host.Close();