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:
- 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 utilizam o Visual Studio 2019.
- SDK do Azure para .NET. Instale-o a partir da página de transferências do SDK.
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
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.
No Visual Studio, selecione Criar um novo projeto.
Em Criar um novo projeto, selecione Aplicação de Consola (.NET Framework) para C# e selecione Seguinte.
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.No Explorador de Soluções, clique com o botão direito do rato no projeto ImageListener e, em seguida, selecione Gerir Pacotes NuGet.
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
.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.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:
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.
Mude o nome do
ImageListener
espaço de nomes paraMicrosoft.ServiceBus.Samples
.namespace Microsoft.ServiceBus.Samples { ...
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 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 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.
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 pretende 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(); }
Adicionar o
WebGet
valor permite ao serviço de reencaminhamento encaminhar pedidos HTTP GET paraGetImage
e traduzir os valores devolvidos deGetImage
para umaHTTP GETRESPONSE
resposta. Mais adiante no tutorial, irá utilizar um browser para aceder a este método e para apresentar a imagem no browser.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, 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 oGetImage
valor devolvido e traduzê-lo numHTTP GETRESPONSE
para o browser do cliente.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
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 { }
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.
Adicione uma imagem.jpg ao seu projeto. Este ficheiro é uma imagem que o serviço apresenta no browser de receção.
- Clique com o botão direito do rato no projeto e selecione Adicionar.
- Em seguida, selecione Item Existente.
- 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.
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.
Utilize o procedimento em Para criar um contrato com uma interface para adicionar uma referência à assemblagem 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 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); } }
Imediatamente após o código anterior, adicione o seguinte
GetImage
método naImageService
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.Selecione Criar>Solução de Compilação.
Para definir a configuração para executar o serviço Web no Service Bus
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 .
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 comoNone
. Esta definição indica que um ponto final que utiliza este enlace 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>
Este conteúdo configura um serviço que utiliza a predefinição
webHttpRelayBinding
definida anteriormente. Também utiliza a predefiniçãosbTokenProvider
, que é definida no passo seguinte.Depois do
<services>
elemento, crie um<behaviors>
elemento com o seguinte conteúdo, substituindoSAS_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>
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>
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
Na declaração de
Main()
função, crie uma variável para armazenar o espaço de nomes do projeto. Certifique-se de que substituiyourNamespace
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.
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
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 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:
- 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.
- Copie e cole o endereço a partir da linha de comandos para um navegador para ver a imagem.
- 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: