Exportar (0) Imprimir
Expandir Tudo

Etapa 3: Implementar um contrato de serviço WCF com base em REST para usar o Service Bus

Atualizado: junho de 2014

Essa é a terceira de quatro tarefas necessárias para criar um serviço básico no estilo REST do Service Bus. Para ter uma visão geral de todas as tarefas, consulte o tópico Tutorial de REST do Service Bus. Criar um serviço do Service Bus no estilo REST requer primeiro a criação do contrato, que é definido usando uma interface. Para obter mais informações sobre criar a interface, consulte Etapa 2: Definir um contrato de serviço WCF com base em REST para usar com o Service Bus. A etapa seguinte, mostrada neste exemplo, é implementar a interface. Isso envolve criar uma classe chamada ImageService que implementa a interface definida pelo usuário IImageContract. Depois de implementar o contrato, você então configura a interface usando um arquivo App.config. O arquivo de configuração contém as informações necessárias para o aplicativo, como o nome do serviço, o nome do contrato e o tipo de protocolo que é usado para comunicar com o Service Bus. O código usado para essas tarefas é fornecido no exemplo que se segue ao procedimento.

Assim como nas etapas anteriores, há muito pouca diferença entre implementar um contrato no estilo REST e um contrato básico do Service Bus.

Tempo estimado para conclusão: 10 minutos

  1. Crie uma nova classe chamada ImageService diretamente abaixo da definição da interface IImageContract. A classe ImageService implementa a interface IImageContract.

    class ImageService : IImageContract
    {
    }
    

    Similar a outras implementações de interface, é possível implementar a definição em um arquivo diferente. No entanto, para este tutorial, a implementação aparece no mesmo arquivo que a definição da interface e o método Main().

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

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

    Como mencionado anteriormente, este namespace não é um namespace tradicional. Em vez disso, ele é parte da arquitetura do WCF que identifica o contrato. Para obter mais informações, consulte o tópico Nomes de Contratos de Dados na documentação do WCF.

  3. Adicione uma imagem .jpg a seu projeto.

    Esta é uma imagem que o serviço exibe no navegador receptor. Clique com o botão direito do mouse em seu projeto, clique em Adicionar. A seguir, clique em Item Existente. Use a caixa de diálogo Adicionar Item Existente para navegar para um .jpg adequado e clique em Adicionar. Um exemplo de arquivo .jpg está disponível em <SDKInstallDir>\Samples\ServiceBus\ExploringFeatures\Bindings\WebHttp\CS35\Service\image.jpg.

    Ao adicionar o arquivo, assegure-se de que Todos os arquivos (*.*) esteja selecionado na lista suspensa próxima ao campo Nome do arquivo:. O restante deste tutorial presume que o nome da imagem é "image.jpg". Se você tiver um .jpg diferente, deverá renomear a imagem ou alterar o código para compensar.

  4. Para garantir que o serviço em execução possa encontrar o arquivo de imagem, no Solution Explorer, clique com o botão direito do mouse no arquivo de imagem. No painel Propriedades, defina Copiar para Diretório de Saída como Copiar se mais novo.

  5. Adicione referências aos assemblies System.Drawing.dll, System.Runtime.Serialization.dll e Microsoft.ServiceBus.dll aao projeto, bem como às seguintes declarações using.

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
    
  6. Defina um construtor que carregue o bitmap e prepare-o para envio ao navegador cliente:

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
    
    
  7. Diretamente abaixo do código anterior, adicione o seguinte método GetImage na classe ImageService para retornar uma mensagem HTTP que contenha 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;
    }
    

    Essa implementação usa MemoryStream para recuperar a imagem e prepará-la para streaming para o navegador. Ela inicia a posição do stream em zero, declara o conteúdo do stream como um jpeg e faz o streaming das informações.

  8. No menu Compilar, clique em Compilar Solução para compilar a solução completa.

  1. Clique com o botão direito do mouse no projeto ImageListener. A seguir, clique em Adicionar, Novo Item.

  2. Na caixa de diálogo Adicionar Novo Item, no painel Modelos, selecione Configuração de Aplicativo. A seguir, clique em Adicionar.

    O arquivo de configuração parece-se com um arquivo de configuração do WCF e inclui o nome do serviço, o ponto de extremidade (ou seja, o local que o Service Bus expõe para clientes e hosts para que se comuniquem entre si) e a associação (o tipo de protocolo usado para a comunicação). A diferença principal aqui é que o ponto de extremidade do serviço configurado refere-se à associação WebHttpRelayBinding, que não faz parte do . WebHttpRelayBinding é uma das novas associações introduzidas no Service Bus. Para obter mais informações sobre como configurar um aplicativo do Service Bus, consulte Configurar um serviço WCF para se registrar no Service Bus.

  3. Em Solution Explorer, clique em App.config, que atualmente contém os seguintes elementos XML:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    </configuration>
    
  4. Adicione um elemento XML ao arquivo App.config para system.serviceModel. Esse é um elemento do WCF que define um ou mais serviços. Aqui, ele é usado para definir o nome do serviço e o ponto de extremidade.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        
      </system.serviceModel>
      
    </configuration>
    
  5. Dentro do elemento system.serviceModel, adicione um elemento <bindings> que tenha o conteúdo a seguir. Isso define as associações usadas no aplicativo. É possível definir várias associações, mas, para este tutorial, você define apenas uma.

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

    Esta etapa define uma associação Service Bus WebHttpRelayBinding com o relayClientAuthenticationType como None. Isto indica que um ponto de extremidade usando esta associação não exigirá uma credencial de cliente.

  6. Abaixo do elemento <bindings>, adicione um elemento <services>. Assim como com as associações, é possível definir vários serviços em um único arquivo de configuração. No entanto, para este tutorial, você define 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="sharedSecretClientCredentials"
                  address="" />
      </service>
    </services>
    

    Esta etapa configura um serviço que usa o padrão previamente definido em webHttpRelayBinding. Ela também usa o padrão de sharedSecretClientCredentials, que é definido na próxima etapa.

  7. Abaixo do elemento <services>, crie um elemento <behaviors>, com o conteúdo a seguir substituindo “ISSUER_NAME” e “ISSUER_SECRET” pelo seu nome e segredo do emissor, respectivamente.

    <behaviors>
      <endpointBehaviors>
        <behavior name="sharedSecretClientCredentials">
          <transportClientEndpointBehavior credentialType="SharedSecret">
            <clientCredentials>
              <sharedSecret issuerName="ISSUER_NAME" issuerSecret="ISSUER_SECRET" />
            </clientCredentials>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    

    O sharedSecretClientCredentials define o tipo de credenciais que o serviço usa para acessar o Service Bus: SharedSecret. Além disso, os nomes e segredos reais do emissor são armazenados no arquivo App.config. Observe que armazenar segredos em texto simples não é considerada uma boa prática de programação para código de produção. Assegure-se de implementar uma segurança mais rigorosa em seu próprio código.

    Este código também define o comportamento padrão da depuração, que consiste em desativar as páginas de ajuda HTTP e HTTPS.

  8. No menu Compilar, selecione Compilar Solução para compilar a solução completa.

Exemplo

O código a seguir mostra a implementação do contrato e do serviço para um serviço com base em REST, em execução no Service Bus usando a associação 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 = "http://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

    [ServiceBehavior(Name = "ImageService", Namespace = "http://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 a seguir mostra o arquivo App.config associado com o serviço.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <!-- Application Binding -->
      <webHttpRelayBinding>
        <binding name="default">
          <!-- Turn off client authentication so that client does not need to present credential through browser or fiddler -->
          <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="sharedSecretClientCredentials"
                  address="" />
      </service>
    </services>

    <behaviors>
      <endpointBehaviors>
        <behavior name="sharedSecretClientCredentials">
          <transportClientEndpointBehavior credentialType="SharedSecret">
            <clientCredentials>
              <sharedSecret issuerName="ISSUER_NAME" issuerSecret="ISSUER_SECRET" />
            </clientCredentials>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

Agora que você configurou e implementou o contrato de serviço Web, prossiga para Etapa 4: Hospedar o serviço WCF baseado em REST para usar o Service Bus.

A Microsoft está realizando uma pesquisa online para saber sua opinião sobre o site do MSDN. Se você optar por participar, a pesquisa online lhe será apresentada quando você sair do site do MSDN.

Deseja participar?
Mostrar:
© 2014 Microsoft