Kurz: Kurz azure WCF Relay REST

Tento kurz popisuje, jak vytvořit hostitelskou aplikaci Azure Relay, která zpřístupň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 služby Windows Communication Foundation (WCF) k vytvoření služby REST ve službě Azure Relay. Další informace najdete v tématech Programovací model REST WCF 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 rozhraní 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:

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 WCF ve stylu REST 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 pro každou operaci.

Tip

Pokud metoda v rozhraní, které má ServiceContractAttribute nemá OperationContractAttribute, není tato metoda vystavena. Kód použitý pro tyto úlohy se zobrazí v příkladu za postupem.

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á atribut WebGetAttribute 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 s rozhraním

  1. Spusťte Microsoft Visual Studio jako správce. Uděláte to tak, že kliknete pravým tlačítkem na ikonu programu sady Visual Studio a vyberete Spustit jako správce.

  2. V sadě Visual Studio vyberte Vytvořit nový projekt.

  3. V části Vytvořit nový projekt zvolte Konzolová aplikace (.NET Framework) pro C# a vyberte Další.

  4. Pojmenujte projekt ImageListener. Použijte výchozí umístění a pak vyberte Vytvořit.

    Pro projekt 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.

  5. V Průzkumník řešení klikněte pravým tlačítkem na projekt ImageListener a pak vyberte Spravovat balíčky NuGet.

  6. Vyberte Procházet a pak vyhledejte a zvolte WindowsAzure.ServiceBus. Vyberte Nainstalovat 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.

  7. Explicitně přidejte odkaz na System.ServiceModel.Web.dll projekt. V Průzkumník řešení klikněte pravým tlačítkem na Odkazy ve složce projektu a vyberte Přidat odkaz.

  8. V části Přidat odkaz vyberte Framework a do vyhledávacího pole zadejte System.ServiceModel.Web. Zaškrtněte políčko System.ServiceModel.Web a pak vyberte OK.

Dále proveďte v projektu následující změny kódu:

  1. 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í přenosu.
    • System.ServiceModel.Channels pomáhá definovat kanál, což je objekt, přes který komunikujete s Azure Relay a klientským webovým prohlížečem.
    • System.ServiceModel.Web obsahuje typy, které umožňují vytvářet webové aplikace.
  2. Přejmenujte ImageListener obor názvů na Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  3. Přímo po otevření složené závorky deklarace oboru názvů definujte nové rozhraní s názvem IImageContract a použijte ServiceContractAttribute atribut na rozhraní s hodnotou https://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ěla by obsahovat 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.

  4. IImageContract V rámci rozhraní deklarujte metodu pro jednu operaci, kterou IImageContract kontrakt zveřejňuje v rozhraní, a použijte OperationContract atribut na metodu, kterou chcete zveřejnit jako součást veřejné smlouvy Service Bus.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  5. Do atributu OperationContract přidejte WebGet hodnotu.

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

    WebGet Přidáním hodnoty umožníte službě relay směrovat požadavky HTTP GET na GetImagea přeložit návratové GetImageHTTP GETRESPONSE hodnoty do 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.

  6. Přímo po definici IImageContract deklarujte kanál, který zdědí vlastnosti z rozhraní IImageContract i IClientChannel.

    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 tento kanál použije k předávání požadavků HTTP GET z prohlížeče do vaší GetImage implementace. Přenos také používá kanál k převzetí návratové GetImage hodnoty a k jejímu překladu HTTP GETRESPONSE do pro klientský prohlížeč.

  7. Vyberte Sestavit>řešení sestavení a potvrďte 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í souboruApp.config . Konfigurační soubor obsahuje potřebné 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 příkladu za postupem.

Stejně jako v předchozích krocích je mezi implementací kontraktu ve stylu REST a kontraktu WCF Relay malý rozdíl.

Implementace kontraktu Service Bus ve stylu REST

  1. Vytvořte novou třídu s názvem ImageService přímo po definování rozhraní IImageContract. Třída ImageService 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().

  2. Použít ServiceBehaviorAttribute atribut na IImageService třídu, aby bylo uvedeno, ž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, tento obor názvů není tradiční obor názvů. Je součástí architektury WCF, která identifikuje kontrakt. Další informace najdete v tématu Názvy kontraktů dat.

  3. Přidejte do projektu obrázek.jpg . Tento soubor je obrázek, který služba zobrazí v přijímajícím prohlížeči.

    1. Klikněte pravým tlačítkem na projekt a vyberte Přidat.
    2. Pak vyberte Existující položka.
    3. 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 položky Název souborumož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, aby se to vykompenzoval.

  4. 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 zvolte Vlastnosti. V části Vlastnosti nastavte Kopírovat do výstupního adresáře na Kopírovat, pokud je novější.

  5. Pomocí postupu v části Vytvoření kontraktu s rozhraním přidejte odkaz na System.Drawing.dll sestavení do projektu.

  6. 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;
    
  7. ImageService Do třídy přidejte následující konstruktor, který načte rastrový obrázek a připraví se na jeho 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);
        }
    }
    
  8. Přímo za předchozí kód přidejte do třídy následující GetImage metodu ImageService , 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 k přípravě na streamování do prohlížeče. Zahájí pozici streamu na nule, deklaruje obsah streamu jako .jpga streamuje informace.

  9. Vyberte Sestavit>řešení sestavení.

Definování konfigurace pro spuštění webové služby v Service Bus

  1. V Průzkumník řešení poklikáním na App.config otevřete soubor v editoru sady Visual Studio.

    SouborApp.config obsahuje název služby, koncový bod a vazbu. Koncový bod je umístění, ve které služba Azure Relay zpřístupňuje klientům a hostitelům vzájemnou komunikaci. 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 .

  2. 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. Na konec elementu <system.serviceModel> , ale stále v rámci <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 pro účely tohoto kurzu definujete jenom jednu.

    Předchozí kód definuje vazbu WCF Relay WebHttpRelayBinding s nastavenou relayClientAuthenticationType na None. Toto nastavení označuje, že koncový bod používající tuto vazbu nevyžaduje přihlašovací údaje klienta.

  3. 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í webHttpRelayBindinghodnotu . Používá také výchozí sbTokenProviderhodnotu , která je definovaná v dalším kroku.

  4. <services> Za elementem <behaviors> vytvořte element s následujícím obsahem a nahraďte SAS_KEY klíčem sdíleného přístupového podpisu (SAS). Pokud chcete získat klíč SAS z 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>
    
  5. Stále vApp.configv elementu <appSettings> nahraďte celou hodnotu připojovacího řetězce připojovacím řetězcem, který 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>
    
  6. Vyberte Sestavit>řešení sestavení a sestavte celé řešení.

Příklad implementace kontraktu služby WCF založeného na REST

Následující kód ukazuje kontrakt a implementaci služby založené 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 souborApp.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 se službou WCF Relay. Úplný výpis kódu napsaného v této části se zobrazí v příkladu za tímto postupem.

Vytvoření bázové adresy pro tuto službu

  1. Main() V deklaraci funkce vytvořte proměnnou pro uložení oboru názvů projektu. Nezapomeňte nahradit yourNamespace 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.

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

Stále v Main()nástroji 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 mu předá typ hostitele, kterého chcete vytvořit, což je ImageService, a také adresu, na které chcete hostitelskou aplikaci zveřejnit.

Spuštění hostitele webové služby

  1. Stále v Main()souboru přidejte následující řádek, aby se služba otevřela.

    host.Open();
    

    Služba teď běží.

  2. 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();
    
  3. Po dokončení zavřete hostitele služby.

    host.Close();
    

Příklad servisní smlouvy a implementace

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ázvemImageListener.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 testování služby

Po sestavení řešení proveďte následující kroky pro spuštění aplikace:

  1. Pokud chcete službu spustit, vyberte F5 nebo přejděte do umístění spustitelného souboru ImageListener\bin\Debug\ImageListener.exe. Nechte aplikaci spuštěnou, protože je potřebná pro další krok.
  2. Zkopírujte a vložte adresu z příkazového řádku do prohlížeče, zobrazí se obrázek.
  3. Až budete hotovi, vyberte Enter v okně příkazového řádku a zavřete aplikaci.

Další kroky

Teď, když jste vytvořili aplikaci, která používá službu Azure Relay, najdete další informace v následujících článcích: