Esercitazione: Esercitazione su REST per l'inoltro WCF di Azure

Questa esercitazione descrive come creare un'applicazione host Inoltro di Azure che espone un'interfaccia basata su REST. REST consente ai client Web, ad esempio un Web browser, di accedere all'API del bus di servizio tramite richieste HTTP.

In questa esercitazione viene usato il modello di programmazione REST di Windows Communication Foundation (WCF) per creare un servizio REST nel servizio di inoltro di Azure. Per altre informazioni, vedere Modello di programmazione REST WCF e Progettazione e implementazione di servizi.

In questa esercitazione si eseguiranno le attività seguenti:

  • Installare i prerequisiti per questa esercitazione.
  • Creare uno spazio dei nomi di inoltro.
  • Definire un contratto di servizio WCF basato su REST.
  • Implementare il contratto WCF basato su REST.
  • Ospitare ed eseguire il servizio WCF basato su REST.
  • Eseguire e testare il servizio.

Prerequisiti

Per completare questa esercitazione è necessario soddisfare i prerequisiti seguenti:

Creare uno spazio dei nomi di inoltro

Per usare le funzionalità del servizio d'inoltro di Azure, è prima necessario creare uno spazio dei nomi del servizio. Uno spazio dei nomi funge da contenitore di ambito in cui indirizzare le risorse di Azure nell'applicazione. Seguire le istruzioni qui per creare uno spazio dei nomi di inoltro.

Definire un contratto di servizio WCF basato su REST da usare con Inoltro di Azure

Quando si crea un servizio basato su REST WCF, è necessario definire il contratto. Il contratto specifica quali operazioni sono supportate dall'host. Un'operazione del servizio è simile a un metodo del servizio Web. Definire un contratto con un'interfaccia C++, C# o Visual Basic. Ogni metodo dell'interfaccia corrisponde a un'operazione di servizio specifico. Applicare l'attributo ServiceContractAttribute a ogni interfaccia e applicare l'attributo OperationContractAttribute a ogni operazione.

Suggerimento

Se un metodo di un'interfaccia che ha ServiceContractAttribute non ha OperationContractAttribute, il metodo non viene esposto. Il codice usato per eseguire queste attività è illustrato nell'esempio che segue la procedura.

La differenza principale tra un contratto di WCF e un contratto di tipo REST è costituita dall'aggiunta di una proprietà all'attributo OperationContractAttribute: WebGetAttribute. Questa proprietà consente di eseguire il mapping di un metodo dell'interfaccia a un metodo su altro lato dell'interfaccia. Questo esempio usa l'attributo WebGetAttribute per collegare un metodo a HTTP GET. Questo approccio consente al bus di servizio di recuperare e interpretare in modo accurato i comandi inviati all'interfaccia.

Per creare un contratto con un'interfaccia

  1. Avviare Microsoft Visual Studio come amministratore. A tale scopo, fare clic con il tasto destro del mouse sull'icona del programma Visual Studio e selezionare Esegui come amministratore.

  2. In Visual Studio selezionare Crea un nuovo progetto.

  3. In Crea un nuovo progetto scegliere App console (.NET Framework) per C# e selezionare Avanti.

  4. Denominare il progetto ImageListener. Usare la Posizione predefinita e quindi selezionare Crea.

    Per un progetto C#, Visual Studio crea un file Program.cs. Questa classe contiene un metodo Main() vuoto, necessario per una corretta compilazione del progetto di applicazione console.

  5. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ImageListener e quindi selezionare Gestisci pacchetti NuGet.

  6. Selezionare Sfoglia, quindi cercare e scegliere WindowsAzure.ServiceBus. Selezionare Installa e accettare le condizioni per l'utilizzo.

    Questo passaggio aggiunge riferimenti al bus di servizio e a System.ServiceModel.dll. Questo pacchetto aggiunge automaticamente riferimenti alle librerie del bus di servizio e a System.ServiceModel di WCF.

  7. Aggiungere in modo esplicito un riferimento a System.ServiceModel.Web.dll al progetto. In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti nella cartella di progetto e selezionare Aggiungi riferimento.

  8. In Aggiungi riferimento selezionare Framework e immettere System.ServiceModel.Web in Cerca. Selezionare la casella di controllo System.ServiceModel.Web e quindi selezionare OK.

Quindi apportare le modifiche di codice seguenti al progetto:

  1. Aggiungere le istruzioni using seguenti all'inizio del file Program.cs.

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    using System.IO;
    
    • System.ServiceModel è lo spazio dei nomi che consente l'accesso a livello di codice alle funzionalità di base di WCF. Inoltro WCF usa molti oggetti e attributi di WCF per definire i contratti di servizio. Questo spazio dei nomi viene usato nella maggior parte delle applicazioni di inoltro.
    • System.ServiceModel.Channels consente di definire il canale, ovvero l'oggetto usato per comunicare con il servizio Inoltro di Azure e il Web browser client.
    • System.ServiceModel.Web contiene i tipi che consentono di creare applicazioni basate sul Web.
  2. Rinominare lo spazio dei nomi ImageListener in Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  3. Subito dopo la parentesi graffa aperta nella dichiarazione dello spazio dei nomi, definire una nuova interfaccia denominata IImageContract e applicare l'attributo ServiceContractAttribute all'interfaccia con il valore https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1.

    [ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1")]
    public interface IImageContract
    {
    }
    

    Il valore dello spazio dei nomi è diverso dallo spazio dei nomi usato nell'ambito del codice. Il valore dello spazio dei nomi è un identificatore univoco per questo contratto e deve includere informazioni sulla versione. Per altre informazioni, vedere Controllo delle versioni del servizio. Specificando lo spazio dei nomi in modo esplicito si impedisce che il valore predefinito dello spazio dei nomi venga aggiunto al nome del contratto.

  4. Nell'interfaccia IImageContract dichiarare un metodo per la singola operazione esposta dal contratto IImageContract nell'interfaccia e applicare l'attributo OperationContract al metodo da esporre come parte del contratto pubblico del bus di servizio.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  5. Nell'attributo OperationContract aggiungere il valore WebGet.

    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }
    

    L'aggiunta del valore WebGet consente al servizio di inoltro di instradare le richieste HTTP GET a GetImage e di convertire i valori restituiti di GetImage in una risposta HTTP GETRESPONSE. Più avanti nell'esercitazione verrà usato un Web browser per accedere a questo metodo e per visualizzare l'immagine nel browser.

  6. Subito dopo la definizione di IImageContract, dichiarare un canale che eredita dalle interfacce IImageContract e IClientChannel.

    public interface IImageChannel : IImageContract, IClientChannel { }
    

    Un canale è l'oggetto WCF tramite il quale il servizio e il client si scambiano le informazioni. In seguito verrà creato il canale nell'applicazione host. Il servizio Inoltro di Azure usa quindi questo canale per passare le richieste HTTP GET dal browser all'implementazione di GetImage. L'inoltro usa il canale anche per richiedere il valore restituito GetImage e convertirlo in HTTP GETRESPONSE per il browser client.

  7. Selezionare Compila>Compila soluzione per verificare la correttezza del lavoro svolto.

Esempio che definisce un contratto di Inoltro WCF

L'esempio di codice seguente illustra un'interfaccia di base che definisce un contratto dell'inoltro WCF.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
using System.IO;

namespace Microsoft.ServiceBus.Samples
{

    [ServiceContract(Name = "IImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Implementare il contratto di servizio WCF basato su REST

Per creare un servizio Inoltro WCF di tipo REST, creare innanzitutto il contratto usando un'interfaccia. Il passaggio successivo consiste nell'implementazione dell'interfaccia. Questa procedura richiede la creazione di una classe denominata ImageService che implementa l'interfaccia IImageContract definita dall'utente. Dopo aver implementato il contratto, è quindi necessario configurare l'interfaccia usando un file App.config. Il file di configurazione contiene le informazioni necessarie per l'applicazione. Le informazioni includono il nome del servizio, il nome del contratto e il tipo di protocollo usato per comunicare con il servizio di inoltro. Il codice usato per eseguire queste attività è illustrato nell'esempio che segue la procedura.

Come nella procedura precedente, è impercettibile la differenza tra l'implementazione di un contratto di tipo REST e quella di un contratto di Inoltro WCF.

Per implementare un contratto del bus di servizio di tipo REST

  1. Creare una nuova classe denominata ImageService direttamente dopo la definizione dell’interfaccia IImageContract. La classe ImageService implementa l'interfaccia IImageContract.

    class ImageService : IImageContract
    {
    }
    

    Analogamente ad altre implementazioni di interfaccia, è possibile implementare la definizione in un altro file. Tuttavia, per questa esercitazione, l'implementazione è presente nello stesso file di definizione dell'interfaccia e del metodo Main().

  2. Applicare l'attributo ServiceBehaviorAttribute alla classe IImageService per indicare che la classe è un'implementazione di un contratto WCF.

    [ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
    }
    

    Come accennato in precedenza, questo spazio dei nomi non è uno spazio dei nomi tradizionale. È parte dell'architettura WCF che identifica il contratto. Per altre informazioni, vedere Nomi di contratto di dati.

  3. Aggiungere un'immagine con estensione jpg al progetto. Il file è un'immagine che viene visualizzata nel browser di ricezione dal servizio.

    1. Fare clic con il pulsante destro del mouse sul progetto e selezionare Aggiungi.
    2. Quindi selezionare Elemento esistente.
    3. Usare Aggiungi elemento esistente per cercare un'immagine con estensione jpg appropriata e quindi selezionare Aggiungi. Quando si aggiunge il file, selezionare Tutti i file dall'elenco a discesa accanto a Nome file.

    Nella parte restante di questa esercitazione si presuppone che il nome dell'immagine sia image.jpg. Se si dispone di un file diverso, è necessario rinominare l'immagine o modificare il codice per compensare.

  4. Per assicurarsi che il servizio in esecuzione riesca a trovare il file di immagine, in Esplora soluzioni fare clic con il pulsante destro del mouse sul file di immagine e scegliere Proprietà. In Proprietà impostare Copia in directory di output su Copia se più recente.

  5. Usare la procedura descritta in Per creare un contratto con un'interfaccia per aggiungere un riferimento all'assembly System.Drawing.dll al progetto.

  6. Aggiungere le istruzioni using associate seguenti:

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
  7. Nella classe ImageService aggiungere il costruttore seguente che carica la bitmap e la prepara per l'invio al browser client:

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
  8. Immediatamente dopo il codice precedente, aggiungere il metodo GetImage seguente nella classe ImageService per restituire un messaggio HTTP che contiene l'immagine.

    public Stream GetImage()
    {
        MemoryStream stream = new MemoryStream();
        this.bitmap.Save(stream, ImageFormat.Jpeg);
    
        stream.Position = 0;
        WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
    
        return stream;
    }
    

    Questa implementazione usa MemoryStream per recuperare l'immagine e prepararla per la trasmissione al browser. Avvia la posizione del flusso da zero, dichiara il contenuto di flusso come jpg e trasmette le informazioni.

  9. Selezionare Compila>Compila soluzione.

Per definire la configurazione per l'esecuzione del servizio Web sul bus di servizio

  1. In Esplora soluzioni fare doppio clic su App.config per aprire il file nell'editor di Visual Studio.

    Il file App.config include il nome del servizio, l'endpoint e l'associazione. L'endpoint è il percorso che Inoltro di Azure espone per la comunicazione tra client e host. L'associazione è il tipo di protocollo usato per comunicare. La differenza principale è che l'endpoint servizio configurato fa riferimento a un'associazione WebHttpRelayBinding .

  2. L'elemento XML <system.serviceModel> è un elemento WCF che definisce uno o più servizi. In questo caso viene usato per definire il nome del servizio e l'endpoint. Nella parte inferiore dell'elemento <system.serviceModel>, sempre all'interno di <system.serviceModel>, aggiungere un elemento <bindings> che include il contenuto seguente:

    <bindings>
        <!-- Application Binding -->
        <webHttpRelayBinding>
            <binding name="default">
                <security relayClientAuthenticationType="None" />
            </binding>
        </webHttpRelayBinding>
    </bindings>
    

    Questo contenuto definisce le associazioni usate nell'applicazione. Sebbene sia possibile definire più associazioni, in questa esercitazione viene definita una sola associazione.

    Il codice precedente definisce un'associazione WebHttpRelayBinding di Inoltro WCF con relayClientAuthenticationType impostato su None. Questa impostazione indica che un endpoint che usa questa associazione non richiede le credenziali client.

  3. Dopo l'elemento <bindings> aggiungere un elemento <services>. Come per le associazioni, è possibile definire più servizi in un solo file di configurazione. Tuttavia, per questa esercitazione, se ne definisce solo uno.

    <services>
        <!-- Application Service -->
        <service name="Microsoft.ServiceBus.Samples.ImageService"
             behaviorConfiguration="default">
            <endpoint name="RelayEndpoint"
                    contract="Microsoft.ServiceBus.Samples.IImageContract"
                    binding="webHttpRelayBinding"
                    bindingConfiguration="default"
                    behaviorConfiguration="sbTokenProvider"
                    address="" />
        </service>
    </services>
    

    Questo contenuto configura un servizio che usa il valore predefinito webHttpRelayBinding definito in precedenza. Usa anche il valore predefinito sbTokenProvider, definito nel passaggio successivo.

  4. Dopo l'elemento <services> creare un elemento <behaviors> con il contenuto seguente, sostituendo SAS_KEY con la chiave di firma di accesso condiviso. Per ottenere una chiave di firma di accesso condiviso dal portale di Azure, vedere Ottenere le credenziali di gestione.

    <behaviors>
        <endpointBehaviors>
            <behavior name="sbTokenProvider">
                <transportClientEndpointBehavior>
                    <tokenProvider>
                        <sharedAccessSignature keyName="RootManageSharedAccessKey" key="YOUR_SAS_KEY" />
                    </tokenProvider>
                </transportClientEndpointBehavior>
            </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="default">
                    <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
                </behavior>
            </serviceBehaviors>
    </behaviors>
    
  5. Nell'elemento <appSettings>, sempre nel file App.config, sostituire il valore dell'intera stringa di connessione con la stringa di connessione ottenuta in precedenza dal portale.

    <appSettings>
       <!-- Service Bus specific app settings for messaging connections -->
       <add key="Microsoft.ServiceBus.ConnectionString"
           value="Endpoint=sb://yourNamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=YOUR_SAS_KEY"/>
    </appSettings>
    
  6. Selezionare Compila>Compila soluzione per compilare l'intera soluzione.

Esempio che implementa il contratto di servizio WCF basato su REST

Il codice seguente illustra l'implementazione del contratto e del servizio per un servizio basato su REST eseguito nel bus di servizio usando l'associazione WebHttpRelayBinding.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Web;

namespace Microsoft.ServiceBus.Samples
{


    [ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

    [ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";

        Image bitmap;

        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;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Nell'esempio seguente è illustrato il file App.config associato al servizio.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
    </startup>
    <system.serviceModel>
        <extensions>
            <!-- In this extension section we are introducing all known service bus extensions. User can remove the ones they don't need. -->
            <behaviorExtensions>
                <add name="connectionStatusBehavior"
                    type="Microsoft.ServiceBus.Configuration.ConnectionStatusElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="transportClientEndpointBehavior"
                    type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="serviceRegistrySettings"
                    type="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </behaviorExtensions>
            <bindingElementExtensions>
                <add name="netMessagingTransport"
                    type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingTransportExtensionElement, Microsoft.ServiceBus,  Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="tcpRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="httpRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.HttpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="httpsRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.HttpsRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="onewayRelayTransport"
                    type="Microsoft.ServiceBus.Configuration.RelayedOnewayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingElementExtensions>
            <bindingExtensions>
                <add name="basicHttpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="webHttpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.WebHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="ws2007HttpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.WS2007HttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netTcpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netOnewayRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetOnewayRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netEventRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetEventRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netMessagingBinding"
                    type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingExtensions>
        </extensions>
      <bindings>
        <!-- Application Binding -->
        <webHttpRelayBinding>
          <binding name="default">
            <security relayClientAuthenticationType="None" />
          </binding>
        </webHttpRelayBinding>
      </bindings>
      <services>
        <!-- Application Service -->
        <service name="Microsoft.ServiceBus.Samples.ImageService"
             behaviorConfiguration="default">
          <endpoint name="RelayEndpoint"
                  contract="Microsoft.ServiceBus.Samples.IImageContract"
                  binding="webHttpRelayBinding"
                  bindingConfiguration="default"
                  behaviorConfiguration="sbTokenProvider"
                  address="" />
        </service>
      </services>
      <behaviors>
        <endpointBehaviors>
          <behavior name="sbTokenProvider">
            <transportClientEndpointBehavior>
              <tokenProvider>
                <sharedAccessSignature keyName="RootManageSharedAccessKey" key="YOUR_SAS_KEY" />
              </tokenProvider>
            </transportClientEndpointBehavior>
          </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
          <behavior name="default">
            <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
    <appSettings>
        <!-- Service Bus specific app settings for messaging connections -->
        <add key="Microsoft.ServiceBus.ConnectionString"
            value="Endpoint=sb://yourNamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=YOUR_SAS_KEY>"/>
    </appSettings>
</configuration>

Ospitare il servizio WCF basato su REST per usare Inoltro di Azure

Questa sezione descrive come eseguire un servizio Web usando un'applicazione console con Inoltro WCF. Un elenco completo del codice scritto in questa sezione viene fornito nell’esempio che segue la procedura.

Per creare un indirizzo di base per il servizio

  1. Nella dichiarazione della funzione Main() creare una variabile per archiviare lo spazio dei nomi del progetto. Assicurarsi di sostituire yourNamespace con il nome dello spazio dei nomi di inoltro creato prima.

    string serviceNamespace = "yourNamespace";
    

    Il bus di servizio utilizza il nome dello spazio dei nomi per creare un URI univoco.

  2. Creare un'istanza di Uri per l'indirizzo di base del servizio basato sullo spazio dei nomi.

    Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image");
    

Per creare e configurare l'host del servizio Web

Sempre in Main() creare l'host del servizio Web usando l'indirizzo URI creato precedentemente in questa sezione.

WebServiceHost host = new WebServiceHost(typeof(ImageService), address);

L'host del servizio è l'oggetto WCF che crea un'istanza dell'applicazione host. In questo esempio viene passato il tipo di host da creare, ovvero ImageService, nonché l'indirizzo in cui si vuole esporre l'applicazione host.

Per eseguire l'host del servizio Web

  1. Sempre in Main() aggiungere la riga seguente per aprire il servizio.

    host.Open();
    

    Il servizio è in esecuzione.

  2. Visualizzare un messaggio che indica che il servizio è in esecuzione e come arrestare il servizio.

    Console.WriteLine("Copy the following address into a browser to see the image: ");
    Console.WriteLine(address + "GetImage");
    Console.WriteLine();
    Console.WriteLine("Press [Enter] to exit");
    Console.ReadLine();
    
  3. Al termine, chiudere l'host del servizio.

    host.Close();
    

Esempio di contratto di servizio e di implementazione

Nell'esempio seguente vengono inclusi il contratto di servizio e l'implementazione dei passaggi precedenti dell'esercitazione e viene ospitato il servizio in un'applicazione console. Compilare il codice seguente in un eseguibile denominato ImageListener.exe.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Web;

namespace Microsoft.ServiceBus.Samples
{

    [ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

    [ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";

        Image bitmap;

        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;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string serviceNamespace = "InsertServiceNamespaceHere";
            Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image");

            WebServiceHost host = new WebServiceHost(typeof(ImageService), address);
            host.Open();

            Console.WriteLine("Copy the following address into a browser to see the image: ");
            Console.WriteLine(address + "GetImage");
            Console.WriteLine();
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            host.Close();
        }
    }
}

Eseguire e testare il servizio

Dopo aver compilato la soluzione, effettuare le operazioni seguenti per eseguire l'applicazione:

  1. Premere F5 o passare al percorso del file eseguibile ImageListener\bin\Debug\ImageListener.exe per eseguire il servizio. Mantenere l'app in esecuzione poiché verrà usata nel passaggio successivo.
  2. Copiare e incollare l'indirizzo dal prompt dei comandi in un browser per visualizzare l'immagine.
  3. Al termine, premere INVIO nella finestra del prompt dei comandi per chiudere l'app.

Passaggi successivi

A questo punto, dopo avere creato un'applicazione che usa il servizio di inoltro di Azure, vedere gli articoli seguenti per altre informazioni: