Tutorial: Tutorial REST do Azure WCF Relay
Este tutorial descreve como criar um aplicativo host do Azure Relay 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 usa 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, consulte Modelo de programação REST do WCF e Projetando e implementando serviços.
Você executa as seguintes tarefas neste tutorial:
- Instale os pré-requisitos para este tutorial.
- Crie um namespace de retransmissão.
- Defina um contrato de serviço WCF baseado em REST.
- Implemente o contrato WCF baseado em REST.
- Hospede e execute o serviço WCF baseado em REST.
- Execute e teste o serviço.
Pré-requisitos
Para concluir este tutorial, precisa dos seguintes pré-requisitos:
- Uma subscrição do Azure. Se não tiver uma, crie uma conta gratuita antes de começar.
- Visual Studio 2015 ou posterior. Os exemplos neste tutorial usam o Visual Studio 2019.
- SDK do Azure para .NET. Instale-o a partir da página de downloads do SDK.
Criar um namespace de retransmissão
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 usar com o Azure Relay
Ao criar um serviço no estilo WCF REST, você deve definir o contrato. O contrato especifica quais as operações suportadas pelo anfitrião. Uma operação de serviço se assemelha 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.
Gorjeta
Se um método em uma interface que tem o ServiceContractAttribute não tem o OperationContractAttribute, esse método não é exposto. O código usado para essas tarefas aparece no exemplo a seguir ao procedimento.
A principal diferença entre um contrato WCF e um contrato no estilo REST é a adição de uma propriedade ao OperationContractAttribute: WebGetAttribute. Esta propriedade permite-lhe mapear um método na sua interface para um método no outro lado da interface. Este exemplo usa o atributo WebGetAttribute para vincular um método a HTTP GET
. Essa abordagem permite que o Service Bus recupere e interprete com precisão os comandos enviados para a interface.
Para criar um contrato com uma interface
Inicie o Microsoft Visual Studio como administrador. Para fazer isso, clique com o botão direito do mouse no ícone do programa Visual Studio e selecione Executar como administrador.
No Visual Studio, selecione Criar um novo projeto.
Em Criar um novo projeto, escolha Aplicativo de Console (.NET Framework) para C# e selecione Avançar.
Nomeie o projeto como ImageListener. Use o Local padrão e selecione Criar.
Para um projeto C#, o Visual Studio cria um arquivo Program.cs . Esta classe contém método
Main()
vazio, necessário para que um projeto de aplicação de consola seja criado corretamente.No Gerenciador de Soluções, clique com o botão direito do mouse no projeto ImageListener e selecione Gerenciar Pacotes NuGet.
Selecione Procurar, procure e escolha WindowsAzure.ServiceBus. Selecione Instalar e aceite os termos de uso.
Esta etapa adiciona referências ao Service Bus e ao System.ServiceModel.dll. Este pacote adiciona automaticamente referências às bibliotecas do Service Bus e ao WCF
System.ServiceModel
.Adicione explicitamente uma referência ao
System.ServiceModel.Web.dll
projeto. No Gerenciador de Soluções, clique com o botão direito do mouse em Referências na pasta do projeto e selecione Adicionar Referência.Em Adicionar Referência, selecione Framework e digite System.ServiceModel.Web em Pesquisar. Marque a caixa de seleção System.ServiceModel.Web e selecione OK.
Em seguida, faça as seguintes alterações de código no projeto:
Adicione as seguintes
using
instruções na parte superior do arquivo 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. WCF Relay usa muitos dos objetos e atributos do WCF para definir contratos de serviço. Você usa esse namespace na maioria dos seus aplicativos de retransmissão.
- System.ServiceModel.Channels ajuda a definir o canal, que é o objeto através do qual você se comunica com o Azure Relay e o navegador da Web do cliente.
- System.ServiceModel.Web contém os tipos que permitem criar aplicativos baseados na Web.
Renomeie o
ImageListener
namespace paraMicrosoft.ServiceBus.Samples
.namespace Microsoft.ServiceBus.Samples { ...
Diretamente após a chave de abertura da declaração de namespace, defina uma nova interface chamada
IImageContract
e aplique oServiceContractAttribute
atributo à interface com um valor dehttps://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 namespace é um identificador exclusivo para este contrato e deve ter informações de 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.
IImageContract
Na interface, declare um método para a operação única que oIImageContract
contrato expõe na interface e aplique oOperationContract
atributo ao método que você deseja expor como parte do contrato público do Service Bus.public interface IImageContract { [OperationContract] Stream GetImage(); }
OperationContract
No atributo, adicione oWebGet
valor.public interface IImageContract { [OperationContract, WebGet] Stream GetImage(); }
A adição do
WebGet
valor permite que o serviço de retransmissão roteie solicitações HTTP GET paraGetImage
e converta os valores de retorno deGetImage
em umaHTTP GETRESPONSE
resposta. Mais adiante no tutorial, você usará um navegador da Web para acessar esse método e exibir a imagem no navegador.Imediatamente depois da definição
IImageContract
, declare um canal que herde das interfacesIImageContract
eIClientChannel
.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, você cria o canal em seu aplicativo host. Em seguida, o Azure Relay usa esse canal para passar as solicitações HTTP GET do navegador para sua
GetImage
implementação. O relé também usa o canal para pegar o valor deGetImage
retorno e traduzi-lo em umHTTP GETRESPONSE
para o navegador do cliente.Selecione Build>Build Solution para confirmar a precisão do seu trabalho até agora.
Exemplo que define um contrato de retransmissão WCF
O código a seguir mostra uma interface básica que define um contrato de retransmissão 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 WCF Relay no estilo REST, primeiro crie o contrato usando uma interface. O passo seguinte consiste em implementar a interface. Este procedimento envolve a criação de uma classe chamada ImageService
que implementa a interface definida IImageContract
pelo usuário. Depois de implementar o contrato, configure a interface usando um arquivo App.config . O arquivo de configuração contém as informações necessárias para o aplicativo. Essas informações incluem o nome do serviço, o nome do contrato e o tipo de protocolo usado para se comunicar com o serviço de retransmissão. O código usado para essas tarefas aparece no exemplo a seguir ao procedimento.
Como nas etapas anteriores, há pouca diferença entre implementar um contrato no estilo REST e um contrato WCF Relay.
Para implementar um contrato do Service Bus de estilo REST
Criar uma nova classe com o nome
ImageService
imediatamente depois da definição da interfaceIImageContract
. A classeImageService
implementa a interfaceIImageContract
.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étodo
Main()
.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 { }
Como mencionado anteriormente, esse namespace não é um namespace tradicional. É parte da arquitetura WCF que identifica o contrato. Para obter mais informações, consulte os Nomes de contratos de dados.
Adicione uma imagem .jpg ao seu projeto. Este arquivo é uma imagem que o serviço exibe no navegador de recebimento.
- Clique com o botão direito do mouse no projeto e selecione Adicionar.
- Em seguida, selecione Item existente.
- Use Adicionar Item Existente para procurar um .jpg apropriado e selecione Adicionar. Ao adicionar o arquivo, selecione Todos os arquivos na lista suspensa ao lado de Nome do arquivo.
O restante deste tutorial pressupõe que o nome da imagem é image.jpg. Se você tiver um arquivo diferente, deverá renomear a imagem ou alterar o código para compensar.
Para certificar-se de que o serviço em execução pode encontrar o arquivo de imagem, no Gerenciador de Soluções, clique com o botão direito do mouse no arquivo de imagem e escolha Propriedades. Em Propriedades, defina Copiar para Diretório de Saída como Copiar se for mais recente.
Use o procedimento em Para criar um contrato com uma interface para adicionar uma referência ao assembly System.Drawing.dll ao projeto.
Adicione as seguintes instruções associadas
using
:using System.Drawing; using System.Drawing.Imaging; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Web;
ImageService
Na classe, adicione o seguinte construtor que carrega o bitmap e se prepara para enviá-lo para o navegador cliente:class ImageService : IImageContract { const string imageFileName = "image.jpg"; Image bitmap; public ImageService() { this.bitmap = Image.FromFile(imageFileName); } }
Diretamente após o código anterior, adicione o
ImageService
seguinteGetImage
método na classe para retornar 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 usa
MemoryStream
para recuperar a imagem e prepará-la para streaming para o navegador. Ele inicia a posição do fluxo em zero, declara o conteúdo do fluxo como um .jpg e transmite as informações.Selecione Build Build Solution (Criar>solução de compilação).
Para definir a configuração para executar o serviço Web no Service Bus
No Gerenciador de Soluções, clique duas vezes em App.config para abrir o arquivo no editor do Visual Studio.
O arquivo App.config inclui o nome do serviço, o ponto de extremidade e a ligação. O ponto de extremidade é o local que o Azure Relay expõe para que clientes e hosts se comuniquem entre si. A ligação é o tipo de protocolo usado para se comunicar. A principal diferença aqui é que o ponto de extremidade de serviço configurado refere-se a uma ligação WebHttpRelayBinding .
O elemento XML
<system.serviceModel>
é um elemento de WCF que define um ou vários serviços. Aqui, ele é usado para definir o nome do serviço e o ponto de extremidade. 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 as associações usadas no aplicativo. Você pode definir várias associações, mas para este tutorial você está definindo apenas uma.
O código anterior define uma ligação WCF Relay WebHttpRelayBinding com
relayClientAuthenticationType
definido comoNone
. Essa configuração indica que um ponto de extremidade usando essa associação não requer uma credencial de cliente.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>
Esse conteúdo configura um serviço que usa o padrão
webHttpRelayBinding
definido anteriormente. Ele também usa o padrãosbTokenProvider
, que é definido na próxima etapa.Após o
<services>
elemento , crie um<behaviors>
elemento com o seguinte conteúdo, substituindoSAS_KEY
pela chave SAS (Assinatura de Acesso Compartilhado). Para obter uma chave SAS do portal do Azure, consulte Obter credenciais de gerenciamento.<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>
Ainda em App.config, no elemento , substitua
<appSettings>
todo o valor da cadeia de conexão pela cadeia de conexão obtida anteriormente do 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>
Selecione Build>Build Solution para criar a solução inteira.
Exemplo que implementa o contrato de serviço WCF baseado em REST
O código a seguir mostra o contrato e a implementação de serviço para um serviço baseado em REST que está sendo executado no Service Bus usando a WebHttpRelayBinding
associação.
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 a seguir mostra o arquivo 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>
Hospedar o serviço WCF baseado em REST para usar o Azure Relay
Esta seção descreve como executar um serviço Web usando um aplicativo de console com WCF Relay. Uma lista completa do código escrito nesta seção aparece no exemplo a seguir ao procedimento.
Para criar um endereço base para o serviço
Main()
Na declaração de função, crie uma variável para armazenar o namespace do seu projeto. Certifique-se de substituiryourNamespace
pelo nome do namespace Relay criado anteriormente.string serviceNamespace = "yourNamespace";
O Service Bus utiliza o nome do seu espaço de nomes para criar um URI exclusivo.
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 host do serviço Web, usando o endereço URI criado anteriormente nesta seçã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 passa o tipo de host que você deseja criar, que é um ImageService
, e também o endereço no qual você deseja expor o aplicativo host.
Para executar o anfitrião do serviço Web
Ainda no
Main()
, adicione a seguinte linha para abrir o serviço.host.Open();
O serviço está agora em execução.
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();
Quando terminar, feche o serviço anfitrião.
host.Close();
Exemplo de contrato de prestação de serviços e execuçã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 código a seguir em um executável chamado 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:
- Selecione F5 ou navegue até o local do arquivo executável, ImageListener\bin\Debug\ImageListener.exe, para executar o serviço. Mantenha o aplicativo em execução, porque ele é necessário para a próxima etapa.
- Copie e cole o endereço a partir da linha de comandos para um navegador para ver a imagem.
- Quando terminar, selecione Enter na janela do prompt de comando para fechar o aplicativo.
Conteúdos relacionados
Agora que você criou um aplicativo que usa o serviço de Retransmissão do Azure, consulte os seguintes artigos para saber mais: