Tutorial: Tutorial rest do Reencaminhamento do WCF do Azure

Este tutorial descreve como criar uma aplicação anfitriã de Reencaminhamento do Azure que expõe uma interface baseada em REST. O REST permite que um cliente web, como um navegador, aceda às APIs do Service Bus através de pedidos de HTTP.

O tutorial utiliza o modelo de programação REST do Windows Communication Foundation (WCF) para construir um serviço REST no Azure Relay. Para obter mais informações, veja Modelo de Programação REST do WCF e Estruturação e Implementação de Serviços.

Efetue as seguintes tarefas neste tutorial:

  • Instale os pré-requisitos deste tutorial.
  • Criar um espaço de nomes de Reencaminhamento.
  • Defina um contrato de serviço WCF baseado em REST.
  • Implemente o contrato WCF baseado em REST.
  • Alojar e executar o serviço WCF baseado em REST.
  • Execute e teste o serviço.

Pré-requisitos

Para concluir este tutorial, precisa dos seguintes pré-requisitos:

Criar um espaço de nomes de Reencaminhamento

Para começar a utilizar as funcionalidades do reencaminhamento no Azure, deve criar, em primeiro lugar, um espaço de nomes de serviço. Um espaço de nomes fornece um contentor de âmbito para abordar os recursos do Azure na sua aplicação. Siga as instruções aqui para criar um espaço de nomes de Reencaminhamento.

Definir um contrato de serviço WCF baseado em REST para utilizar com o Reencaminhamento do Azure

Quando cria um serviço de estilo REST do WCF, tem de definir o contrato. O contrato especifica quais as operações suportadas pelo anfitrião. Uma operação de serviço assemelha-se a um método de serviço Web. Defina um contrato com uma interface C++, C#ou Visual Basic. Cada método da interface corresponde a uma operação de serviço específica. Aplique o atributo ServiceContractAttribute a cada interface e aplique o atributo OperationContractAttribute a cada operação.

Dica

Se um método numa interface que tenha o ServiceContractAttribute não tiver o OperationContractAttribute, esse método não será exposto. O código utilizado para estas tarefas aparece no exemplo que segue o procedimento.

A principal diferença entre um contrato WCF e um contrato de estilo REST é a adição de uma propriedade a OperationContractAttribute: WebGetAttribute. Esta propriedade permite-lhe mapear um método na sua interface para um método no outro lado da interface. Este exemplo utiliza o atributo WebGetAttribute para ligar um método a HTTP GET. Esta abordagem permite que o Service Bus obtenha e interprete com precisão os comandos enviados para a interface.

Para criar um contrato com uma interface

  1. Inicie o Microsoft Visual Studio como administrador. Para tal, clique com o botão direito do rato no ícone do programa do Visual Studio e selecione Executar como administrador.

  2. No Visual Studio, selecione Criar um novo projeto.

  3. Em Criar um novo projeto, selecione Aplicação de Consola (.NET Framework) para C# e selecione Seguinte.

  4. Atribua o nome ImageListener ao projeto. Utilize a Localização predefinida e, em seguida, selecione Criar.

    Para um projeto C#, o Visual Studio cria um ficheiro Program.cs . Esta classe contém método Main() vazio, necessário para que um projeto de aplicação de consola seja criado corretamente.

  5. No Explorador de Soluções, clique com o botão direito do rato no projeto ImageListener e, em seguida, selecione Gerir Pacotes NuGet.

  6. Selecione Procurar e, em seguida, procure e escolha WindowsAzure.ServiceBus. Selecione Instalar e aceite os termos de utilização.

    Este passo adiciona referências ao Service Bus e System.ServiceModel.dll. Este pacote adiciona automaticamente referências às bibliotecas do Service Bus e ao WCF System.ServiceModel.

  7. Adicione explicitamente uma referência ao System.ServiceModel.Web.dll projeto. No Explorador de Soluções, clique com o botão direito do rato em Referências na pasta do projeto e selecione Adicionar Referência.

  8. Em Adicionar Referência, selecione Framework e introduza System.ServiceModel.Web na Pesquisa. Selecione a caixa de verificação System.ServiceModel.Web e, em seguida, selecione OK.

Em seguida, faça as seguintes alterações de código ao projeto:

  1. Adicione as seguintes using instruções na parte superior do ficheiro Program.cs .

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    using System.IO;
    
    • System.ServiceModel é o espaço de nomes que permite o acesso através de programação a funcionalidades básicas do WCF. O Reencaminhamento do WCF utiliza muitos dos objetos e atributos do WCF para definir contratos de serviço. Utiliza este espaço de nomes na maioria das aplicações de reencaminhamento.
    • System.ServiceModel.Channels ajuda a definir o canal, que é o objeto através do qual comunica com o Azure Relay e o browser do cliente.
    • System.ServiceModel.Web contém os tipos que lhe permitem criar aplicações baseadas na Web.
  2. Mude o nome do ImageListener espaço de nomes para Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  3. Imediatamente após a chaveta de abertura da declaração de espaço de nomes, defina uma nova interface com o nome IImageContract e aplique o ServiceContractAttribute atributo à interface com um valor de https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1.

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

    O valor do espaço de nomes difere do espaço de nomes que utiliza em todo o âmbito do seu código. O valor do espaço de nomes é um identificador exclusivo para este contrato e deve ter informações sobre a versão. Para obter mais informações, consulte o artigo Controlo de Versões do Serviço. A especificação explícita do espaço de nomes impede que o valor de espaço de nomes predefinido seja adicionado ao nome do contrato.

  4. IImageContract Na interface, declare um método para a operação única que o IImageContract contrato expõe na interface e aplique o OperationContract atributo ao método que pretende expor como parte do contrato público do Service Bus.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  5. OperationContract No atributo , adicione o WebGet valor.

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

    Adicionar o WebGet valor permite ao serviço de reencaminhamento encaminhar pedidos HTTP GET para GetImagee traduzir os valores devolvidos de GetImage para uma HTTP GETRESPONSE resposta. Mais adiante no tutorial, irá utilizar um browser para aceder a este método e para apresentar a imagem no browser.

  6. Imediatamente depois da definiçãoIImageContract, declare um canal que herde das interfaces IImageContract e IClientChannel.

    public interface IImageChannel : IImageContract, IClientChannel { }
    

    Um canal é o objeto de WCF através do qual o serviço e o cliente passam informações entre si. Mais tarde, vai criar o canal na sua aplicação anfitriã. Em seguida, o Azure Relay utiliza este canal para transmitir os pedidos HTTP GET do browser para a sua GetImage implementação. O reencaminhamento também utiliza o canal para obter o GetImage valor devolvido e traduzê-lo num HTTP GETRESPONSE para o browser do cliente.

  7. Selecione Compilar>Solução de Compilação para confirmar a precisão do seu trabalho até agora.

Exemplo que define um contrato de Reencaminhamento do WCF

O código seguinte mostra uma interface básica que define um contrato de Reencaminhamento de 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)
        {
        }
    }
}

Implementar o contrato de serviço WCF baseado em REST

Para criar um serviço de Reencaminhamento de WCF de estilo REST, crie primeiro o contrato com uma interface. O passo seguinte consiste em implementar a interface. Este procedimento envolve a criação de uma classe com o nome ImageService que implementa a interface definida pelo IImageContract utilizador. Depois de implementar o contrato, configure a interface com um ficheiro App.config . O ficheiro de configuração contém as informações necessárias para a aplicação. Estas informações incluem o nome do serviço, o nome do contrato e o tipo de protocolo utilizado para comunicar com o serviço de reencaminhamento. O código utilizado para estas tarefas aparece no exemplo que segue o procedimento.

Tal como acontece com os passos anteriores, existe pouca diferença entre a implementação de um contrato de estilo REST e um contrato de Reencaminhamento de WCF.

Para implementar um contrato do Service Bus de estilo REST

  1. Criar uma nova classe com o nome ImageService imediatamente depois da definição da interface IImageContract. A classe ImageService implementa a interface IImageContract.

    class ImageService : IImageContract
    {
    }
    

    Tal como noutras implementações de interface, pode implementar a definição num ficheiro diferente. No entanto, neste tutorial, a implementação aparece no mesmo ficheiro que a definição de interface e o métodoMain().

  2. Aplique o atributo ServiceBehaviorAttribute à IImageService classe para indicar que a classe é uma implementação de um contrato WCF.

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

    Conforme mencionado anteriormente, este espaço de nomes não é um espaço de nomes tradicional. Faz parte da arquitetura do WCF que identifica o contrato. Para obter mais informações, veja Nomes de Contratos de Dados.

  3. Adicione uma imagem.jpg ao seu projeto. Este ficheiro é uma imagem que o serviço apresenta no browser de receção.

    1. Clique com o botão direito do rato no projeto e selecione Adicionar.
    2. Em seguida, selecione Item Existente.
    3. Utilize Adicionar Item Existente para navegar para uma .jpg adequada e, em seguida, selecione Adicionar. Ao adicionar o ficheiro, selecione Todos os Ficheiros na lista pendente junto a Nome de ficheiro.

    O resto deste tutorial pressupõe que o nome da imagem é image.jpg. Se tiver um ficheiro diferente, tem de mudar o nome da imagem ou alterar o código para compensar.

  4. Para se certificar de que o serviço em execução consegue encontrar o ficheiro de imagem, no Explorador de Soluções , clique com o botão direito do rato no ficheiro de imagem e, em seguida, selecione Propriedades. Em Propriedades, defina Copiar como Diretório de Saída como Copiar se for mais recente.

  5. Utilize o procedimento em Para criar um contrato com uma interface para adicionar uma referência à assemblagem System.Drawing.dll ao projeto.

  6. Adicione as seguintes instruções associadas using :

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
  7. ImageService Na classe , adicione o seguinte construtor que carrega o mapa de bits e se prepara para enviá-lo para o browser cliente:

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
  8. Imediatamente após o código anterior, adicione o seguinte GetImage método na ImageService classe para devolver uma mensagem HTTP que contém a imagem.

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

    Esta implementação utiliza MemoryStream para obter a imagem e prepará-la para transmissão em fluxo para o browser. Inicia a posição do fluxo a zero, declara o conteúdo do fluxo como uma .jpge transmite as informações.

  9. Selecione Criar>Solução de Compilação.

Para definir a configuração para executar o serviço Web no Service Bus

  1. No Explorador de Soluções, faça duplo clique App.config para abrir o ficheiro no editor do Visual Studio.

    O ficheiro App.config inclui o nome do serviço, o ponto final e o enlace. O ponto final é a localização que o Azure Relay expõe para os clientes e anfitriões comunicarem entre si. O enlace é o tipo de protocolo utilizado para comunicar. A principal diferença é que o ponto final de serviço configurado se refere a um enlace WebHttpRelayBinding .

  2. O elemento XML <system.serviceModel> é um elemento de WCF que define um ou vários serviços. Aqui, é utilizado para definir o nome e o ponto final do serviço. Na parte inferior do <system.serviceModel> elemento, mas ainda dentro <system.serviceModel>de , adicione um <bindings> elemento que tenha o seguinte conteúdo:

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

    Este conteúdo define os enlaces utilizados na aplicação. Pode definir vários enlaces, mas neste tutorial está a definir apenas um.

    O código anterior define um enlace WebHttpRelayBinding de Reencaminhamento wcF com relayClientAuthenticationType definido como None. Esta definição indica que um ponto final que utiliza este enlace não requer uma credencial de cliente.

  3. Depois do elemento <bindings>, adicione um elemento <services>. Assim como nos enlaces, pode definir vários serviços num único ficheiro de configuração. No entanto, neste tutorial, definirá apenas um.

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

    Este conteúdo configura um serviço que utiliza a predefinição webHttpRelayBindingdefinida anteriormente. Também utiliza a predefinição sbTokenProvider, que é definida no passo seguinte.

  4. Depois do <services> elemento, crie um <behaviors> elemento com o seguinte conteúdo, substituindo SAS_KEY pela chave assinatura de acesso partilhado (SAS). Para obter uma chave SAS do portal do Azure, veja Obter credenciais de gestão.

    <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. Ainda no App.config, no <appSettings> elemento , substitua todo o valor da cadeia de ligação pela cadeia de ligação que obteve anteriormente no portal.

    <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. Selecione Criar>Solução de Compilação para criar toda a solução.

Exemplo que implementa o contrato de serviço WCF baseado em REST

O código seguinte mostra o contrato e a implementação do serviço para um serviço baseado em REST que está em execução no Service Bus através do WebHttpRelayBinding enlace.

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)
        {
        }
    }
}

O exemplo seguinte mostra o ficheiro App.config associado ao serviço.

<?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>

Alojar o serviço WCF baseado em REST para utilizar o Reencaminhamento do Azure

Esta secção descreve como executar um serviço Web com uma aplicação de consola com o Reencaminhamento de WCF. É apresentada uma lista completa do código escrito nesta secção no exemplo que segue o procedimento.

Para criar um endereço base para o serviço

  1. Na declaração de Main() função, crie uma variável para armazenar o espaço de nomes do projeto. Certifique-se de que substitui yourNamespace pelo nome do espaço de nomes reencaminhamento que criou anteriormente.

    string serviceNamespace = "yourNamespace";
    

    O Service Bus utiliza o nome do seu espaço de nomes para criar um URI exclusivo.

  2. Crie uma instância Uri para o endereço base do serviço que se baseia no espaço de nomes.

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

Para criar e configurar o anfitrião do serviço Web

Ainda no Main(), crie o anfitrião do serviço Web com o endereço URI criado anteriormente nesta secção.

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

O anfitrião do serviço é o objeto de WCF que cria uma instância na aplicação anfitriã. Este exemplo transmite-lhe o tipo de anfitrião que pretende criar, que é um ImageService, e também o endereço no qual pretende expor a aplicação anfitriã.

Para executar o anfitrião do serviço Web

  1. Ainda no Main(), adicione a seguinte linha para abrir o serviço.

    host.Open();
    

    O serviço está agora em execução.

  2. Apresente uma mensagem que indique que o serviço está em execução e como pará-lo.

    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. Quando terminar, feche o serviço anfitrião.

    host.Close();
    

Exemplo do contrato de serviço e implementação

O exemplo seguinte inclui o contrato de serviço e de implementação dos passos anteriores no tutorial e aloja o serviço numa aplicação de consola. Compile o seguinte código num executável com o nome 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();
        }
    }
}

Executar e testar o serviço

Depois de compilar a solução, faça o seguinte procedimento para executar a aplicação:

  1. Selecione F5 ou navegue para a localização do ficheiro executável, ImageListener\bin\Debug\ImageListener.exe, para executar o serviço. Mantenha a aplicação em execução, porque é necessária para o próximo passo.
  2. Copie e cole o endereço a partir da linha de comandos para um navegador para ver a imagem.
  3. Quando tiver terminado, selecione Enter na janela da linha de comandos para fechar a aplicação.

Passos seguintes

Agora que criou uma aplicação que utiliza o serviço de Reencaminhamento do Azure, veja os seguintes artigos para saber mais: