Kurz: Kurz azure WCF Relay REST
Tento kurz popisuje, jak sestavit hostitelskou aplikaci Azure Relay, která zveřejňuje rozhraní založené na REST. REST webovému klientovi, jako je třeba webový prohlížeč, umožňuje přístup k API pro Service Bus přes požadavky HTTP.
Tento kurz používá programovací model REST WCF (Windows Communication Foundation) k vytvoření služby REST ve službě Azure Relay. Další informace naleznete v tématu WCF REST Programovací model a návrh a implementace služeb.
V tomto kurzu provedete následující úlohy:
- Nainstalujte požadavky pro tento kurz.
- Vytvořte obor názvů služby Relay.
- Definujte kontrakt služby WCF založený na REST.
- Implementujte kontrakt WCF založený na REST.
- Hostujte a spusťte službu WCF založenou na REST.
- Spusťte a otestujte službu.
Požadavky
Pro absolvování tohoto kurzu musí být splněné následující požadavky:
- Předplatné Azure. Pokud ho nemáte, vytvořte si bezplatný účet před tím, než začnete.
- Sada Visual Studio 2015 nebo novější. Příklady v tomto kurzu používají Visual Studio 2019.
- Azure SDK pro .NET. Nainstalujte ho ze stránky pro stažení sady SDK.
Vytvoření oboru názvů služby Relay
Pokud chcete začít používat přenosové funkce v Azure, musíte nejdříve vytvořit obor názvů služby. Obor názvů poskytuje kontejner oboru pro adresování prostředků Azure v rámci vaší aplikace. Pokud chcete vytvořit obor názvů Relay, postupujte podle těchto pokynů.
Definování kontraktu služby WCF založeného na REST pro použití se službou Azure Relay
Při vytváření služby VE STYLU REST WCF je nutné definovat kontrakt. Kontrakt určuje, které operace hostitel podporuje. Operace služby se podobá metodě webové služby. Definujte kontrakt pomocí rozhraní jazyka C++, C# nebo Visual Basic. Každá metoda v rozhraní odpovídá konkrétní operaci služby. Použijte Atribut ServiceContractAttribute na každé rozhraní a použijte atribut OperationContractAttribute na každou operaci.
Tip
Pokud metoda v rozhraní, které má ServiceContractAttribute nemá OperationContractAttribute, tato metoda není vystavena. Kód použitý pro tyto úlohy se zobrazí v následujícím příkladu.
Primární rozdíl mezi kontraktem WCF a kontraktem VE stylu REST je přidání vlastnosti OperationContractAttribute: WebGetAttribute. Tato vlastnost vám umožní mapovat metodu ve svém rozhraní k metodě na druhé straně rozhraní. Tento příklad používá WebGetAttribute atribut k propojení metody s HTTP GET
. Tento přístup umožňuje službě Service Bus přesně načítat a interpretovat příkazy odeslané do rozhraní.
Vytvoření kontraktu pomocí rozhraní
Spusťte Microsoft Visual Studio jako správce. Uděláte to tak, že kliknete pravým tlačítkem myši na ikonu programu sady Visual Studio a vyberete Spustit jako správce.
V sadě Visual Studio vyberte Vytvořit nový projekt.
V části Vytvořit nový projekt zvolte Konzolová aplikace (.NET Framework) pro C# a vyberte Další.
Pojmenujte projekt ImageListener. Použijte výchozí umístění a pak vyberte Vytvořit.
V případě projektu jazyka C# vytvoří Visual Studio soubor Program.cs . Tato třída obsahuje prázdnou metodu
Main()
potřebnou ke správnému sestavení projektu konzolové aplikace.V Průzkumník řešení klikněte pravým tlačítkem myši na projekt ImageListener a pak vyberte Spravovat balíčky NuGet.
Vyberte Procházet a pak vyhledejte a zvolte WindowsAzure.ServiceBus. Vyberte Instalovat a přijměte podmínky použití.
Tento krok přidá odkazy na Service Bus a System.ServiceModel.dll. Tento balíček automaticky přidá odkazy na knihovny Service Bus a WCF
System.ServiceModel
.Explicitně přidejte odkaz na
System.ServiceModel.Web.dll
projekt. V Průzkumník řešení klikněte pravým tlačítkem na Odkazy pod složkou projektu a vyberte Přidat odkaz.V add Reference, select Framework and enter System.ServiceModel.Web in Search. Zaškrtněte políčko System.ServiceModel.Web a pak vyberte OK.
V dalším kroku proveďte v projektu následující změny kódu:
Na začátek souboru Program.cs přidejte následující
using
příkazy.using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Web; using System.IO;
- System.ServiceModel je obor názvů, který umožňuje programový přístup k základním funkcím WCF. WCF Relay používá mnoho objektů a atributů WCF k definování kontraktů služeb. Tento obor názvů používáte ve většině aplikací pro přenos.
- System.ServiceModel.Channels pomáhá definovat kanál, což je objekt, přes který komunikujete se službou Azure Relay a webovým prohlížečem klienta.
- System.ServiceModel.Web obsahuje typy, které umožňují vytvářet webové aplikace.
ImageListener
Přejmenujte obor názvů naMicrosoft.ServiceBus.Samples
.namespace Microsoft.ServiceBus.Samples { ...
Přímo za levou složenou závorkou deklarace oboru názvů definujte nové rozhraní s názvem
IImageContract
a použijteServiceContractAttribute
atribut na rozhraní s hodnotouhttps://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1
.[ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1")] public interface IImageContract { }
Hodnota oboru názvů se liší od oboru názvů, které používáte v celém svém kódu. Hodnota oboru názvů je jedinečný identifikátor pro tento kontrakt a měl by mít informace o verzi. Další informace najdete v článku o Správa verzí služeb. Když explicitně zadáte obor názvů, zabráníte tím přidání výchozí hodnoty oboru názvů do názvu kontraktu.
IImageContract
V rámci rozhraní deklarujte metodu pro jednu operaci, kterouIImageContract
kontrakt zveřejňuje v rozhraní, a použijteOperationContract
atribut na metodu, kterou chcete zveřejnit jako součást veřejného kontraktu Service Bus.public interface IImageContract { [OperationContract] Stream GetImage(); }
Do atributu
OperationContract
WebGet
přidejte hodnotu.public interface IImageContract { [OperationContract, WebGet] Stream GetImage(); }
WebGet
Přidání hodnoty umožňuje předávací službě směrovat požadavky HTTP GET doGetImage
a přeložit návratovéGetImage
hodnoty doHTTP GETRESPONSE
odpovědi. Později v tomto kurzu použijete webový prohlížeč pro přístup k této metodě a k zobrazení obrázku v prohlížeči.Přímo po definici
IImageContract
deklarujte kanál, který zdědí vlastnosti z rozhraníIImageContract
iIClientChannel
.public interface IImageChannel : IImageContract, IClientChannel { }
Kanál je objekt WCF, kterým si služba a klient navzájem posílají informace. Později vytvoříte kanál v hostitelské aplikaci. Azure Relay pak pomocí tohoto kanálu předává požadavky HTTP GET z prohlížeče do vaší
GetImage
implementace. Přenosová služba také používá kanál k převzetí návratovéGetImage
hodnoty a jeho překladu do klientskéhoHTTP GETRESPONSE
prohlížeče.Vyberte Sestavit řešení,>abyste potvrdili přesnost vaší dosavadní práce.
Příklad, který definuje kontrakt WCF Relay
Následující kód ukazuje základní rozhraní, které definuje kontrakt WCF Relay.
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)
{
}
}
}
Implementace kontraktu služby WCF založeného na REST
Chcete-li vytvořit službu WCF Relay ve stylu REST, nejprve vytvořte kontrakt pomocí rozhraní. Dalším krokem je implementace rozhraní. Tento postup zahrnuje vytvoření třídy s názvem ImageService
, která implementuje uživatelsky definované IImageContract
rozhraní. Po implementaci kontraktu pak nakonfigurujete rozhraní pomocí souboru App.config . Konfigurační soubor obsahuje nezbytné informace pro aplikaci. Tyto informace zahrnují název služby, název smlouvy a typ protokolu, který se používá ke komunikaci se službou relay. Kód použitý pro tyto úlohy se zobrazí v následujícím příkladu.
Stejně jako v předchozích krocích existuje malý rozdíl mezi implementací kontraktu ve stylu REST a kontraktem WCF Relay.
Implementace kontraktu Service Bus ve stylu REST
Vytvořte novou třídu s názvem
ImageService
přímo po definování rozhraníIImageContract
. TřídaImageService
implementuje rozhraníIImageContract
.class ImageService : IImageContract { }
Podobně jako u implementace jiných rozhraní můžete definici implementovat v jiném souboru. V tomto kurzu se ale implementace objeví ve stejném souboru jako definice rozhraní a metoda
Main()
.Použití ServiceBehaviorAttribute atributu třídy
IImageService
indikuje, že třída je implementace wcf kontraktu.[ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")] class ImageService : IImageContract { }
Jak už jsme zmínili dříve, tento obor názvů není tradičním oborem názvů. Je součástí architektury WCF, která identifikuje kontrakt. Další informace najdete v názvech kontraktů dat.
Přidejte do projektu .jpg obrázek. Tento soubor je obrázek, který služba zobrazí v přijímajícím prohlížeči.
- Klikněte pravým tlačítkem na projekt a vyberte Přidat.
- Pak vyberte Existující položka.
- Pomocí možnosti Přidat existující položku přejděte na odpovídající .jpg a pak vyberte Přidat. Při přidávání souboru vyberte v rozevíracím seznamu vedle názvu souboru možnost Všechny soubory.
Zbytek tohoto kurzu předpokládá, že název image je image.jpg. Pokud máte jiný soubor, musíte obrázek přejmenovat nebo změnit kód tak, aby se kompenzoval.
Chcete-li zajistit, aby spuštěná služba našla soubor obrázku, klikněte v Průzkumník řešení pravým tlačítkem myši na soubor obrázku a pak zvolte Vlastnosti. Ve vlastnostech nastavte kopírovat do výstupního adresáře , pokud je novější.
Pomocí postupu v části Vytvoření kontraktu s rozhraním přidejte odkaz na sestavení System.Drawing.dll do projektu.
Přidejte následující přidružené
using
příkazy:using System.Drawing; using System.Drawing.Imaging; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Web;
ImageService
Do třídy přidejte následující konstruktor, který načte rastrový obrázek a připraví ho k odeslání do klientského prohlížeče:class ImageService : IImageContract { const string imageFileName = "image.jpg"; Image bitmap; public ImageService() { this.bitmap = Image.FromFile(imageFileName); } }
Přímo za předchozí kód přidejte do
ImageService
třídy následujícíGetImage
metodu, která vrátí zprávu HTTP, která obsahuje obrázek.public Stream GetImage() { MemoryStream stream = new MemoryStream(); this.bitmap.Save(stream, ImageFormat.Jpeg); stream.Position = 0; WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; return stream; }
Tato implementace používá
MemoryStream
k načtení image a přípravě na streamování do prohlížeče. Spustí pozici datového proudu na nule, deklaruje obsah datového proudu jako .jpg a streamuje informace.Vyberte Sestavit>řešení.
Definování konfigurace pro spuštění webové služby v Service Bus
V Průzkumník řešení poklikáním na App.config otevřete soubor v editoru sady Visual Studio.
Soubor App.config obsahuje název služby, koncový bod a vazbu. Koncový bod je umístění, které Azure Relay zveřejňuje klientům a hostitelům, aby mezi sebou komunikovali. Vazba je typ protokolu, který se používá ke komunikaci. Hlavní rozdíl spočívá v tom, že nakonfigurovaný koncový bod služby odkazuje na vazbu WebHttpRelayBinding .
XML element
<system.serviceModel>
je element WCF, který definuje jednu nebo víc služeb. Tady se používá k definování názvu služby a koncového bodu. V dolní části<system.serviceModel>
prvku, ale stále uvnitř<system.serviceModel>
, přidejte<bindings>
prvek, který má následující obsah:<bindings> <!-- Application Binding --> <webHttpRelayBinding> <binding name="default"> <security relayClientAuthenticationType="None" /> </binding> </webHttpRelayBinding> </bindings>
Tento obsah definuje vazby použité v aplikaci. Můžete definovat více vazeb, ale v tomto kurzu definujete pouze jednu.
Předchozí kód definuje vazbu WCF Relay WebHttpRelayBinding s
relayClientAuthenticationType
nastavenou naNone
. Toto nastavení označuje, že koncový bod používající tuto vazbu nevyžaduje přihlašovací údaje klienta.Za element
<bindings>
přidejte element<services>
. Podobně jako u vazeb můžete v jednom konfiguračním souboru definovat několik služeb. V tomto kurzu ale definujete jen jednu.<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>
Tento obsah konfiguruje službu, která používá dříve definovanou výchozí hodnotu
webHttpRelayBinding
. Používá také výchozísbTokenProvider
hodnotu , která je definována v dalším kroku.Za element
<services>
vytvořte<behaviors>
prvek s následujícím obsahem a nahraďteSAS_KEY
ho klíčem sdíleného přístupového podpisu (SAS). Pokud chcete získat klíč SAS z webu Azure Portal, přečtěte si téma Získání přihlašovacích údajů pro správu.<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>
V souboru App.config v elementu
<appSettings>
nahraďte celou hodnotu připojovací řetězec připojovací řetězec, kterou jste předtím získali z portálu.<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>
Výběrem možnosti Sestavit>řešení sestavení sestavíte celé řešení.
Příklad implementace kontraktu služby WCF založeného na REST
Následující kód ukazuje implementaci kontraktu a služby pro službu založenou na REST, která je spuštěná ve službě Service Bus pomocí vazby WebHttpRelayBinding
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Web;
namespace Microsoft.ServiceBus.Samples
{
[ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
public interface IImageContract
{
[OperationContract, WebGet]
Stream GetImage();
}
public interface IImageChannel : IImageContract, IClientChannel { }
[ServiceBehavior(Name = "ImageService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
class ImageService : IImageContract
{
const string imageFileName = "image.jpg";
Image bitmap;
public ImageService()
{
this.bitmap = Image.FromFile(imageFileName);
}
public Stream GetImage()
{
MemoryStream stream = new MemoryStream();
this.bitmap.Save(stream, ImageFormat.Jpeg);
stream.Position = 0;
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
return stream;
}
}
class Program
{
static void Main(string[] args)
{
}
}
}
Následující příklad ukazuje soubor App.config přidružený ke službě.
<?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>
Hostování služby WCF založené na REST pro použití služby Azure Relay
Tato část popisuje, jak spustit webovou službu pomocí konzolové aplikace s WCF Relay. Úplný výpis kódu napsaného v této části se zobrazí v příkladu podle postupu.
Vytvoření bázové adresy pro tuto službu
Main()
V deklaraci funkce vytvořte proměnnou pro uložení oboru názvů projektu. Nezapomeňte nahradityourNamespace
názvem oboru názvů služby Relay, který jste vytvořili dříve.string serviceNamespace = "yourNamespace";
Service Bus použije název vašeho oboru názvů k vytvoření jedinečné URI.
Vytvořte instanci
Uri
pro bázovou adresu služby, která je založená na tomto oboru názvů.Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image");
Vytvoření a konfigurace hostitele webové služby
Main()
Přesto vytvořte hostitele webové služby pomocí adresy URI vytvořené dříve v této části.
WebServiceHost host = new WebServiceHost(typeof(ImageService), address);
Hostitel služby je objekt WCF, který instancuje hostitelskou aplikaci. Tento příklad předá typ hostitele, kterého chcete vytvořit, což je ImageService
a také adresa, na které chcete vystavit hostitelskou aplikaci.
Spuštění hostitele webové služby
Stále v
Main()
, přidejte následující řádek pro otevření služby.host.Open();
Služba teď běží.
Zobrazte zprávu oznamující, že zpráva běží, a jak službu zastavit.
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();
Po dokončení zavřete hostitele služby.
host.Close();
Příklad kontraktu a implementace služby
Následující příklad obsahuje kontrakt a implementaci služby z předchozích kroků tohoto kurzu a hostuje službu v konzolové aplikaci. Zkompilujte následující kód do spustitelného souboru s názvem 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();
}
}
}
Spuštění a otestování služby
Po sestavení řešení proveďte následující kroky pro spuštění aplikace:
- Vyberte F5 nebo přejděte do umístění spustitelného souboru ImageListener\bin\Debug\ImageListener.exe a spusťte službu. Nechte aplikaci spuštěnou, protože je vyžadována pro další krok.
- Zkopírujte a vložte adresu z příkazového řádku do prohlížeče, zobrazí se obrázek.
- Až budete hotovi, zavřete aplikaci výběrem klávesy Enter v okně příkazového řádku.
Související obsah
Teď, když jste vytvořili aplikaci, která používá službu Azure Relay, najdete v následujících článcích další informace: