Samouczek: samouczek dotyczący interfejsu REST usługi Azure WCF Relay

W tym samouczku opisano sposób tworzenia aplikacji hosta usługi Azure Relay, która uwidacznia interfejs oparty na protokole REST. Interfejs REST umożliwia klientowi sieci Web, takiemu jak przeglądarka sieci Web, uzyskiwanie dostępu do interfejsów API usługi Service Bus za pomocą żądań HTTP.

W tym samouczku użyto modelu programowania REST platformy Windows Communication Foundation (WCF) do konstruowania usługi REST w usłudze Azure Relay. Aby uzyskać więcej informacji, zobacz Model programowania REST WCF i Projektowanie i implementowanie usług.

W tym samouczku wykonasz następujące zadania:

  • Zainstaluj wymagania wstępne dotyczące tego samouczka.
  • Utwórz przestrzeń nazw usługi Relay.
  • Definiowanie kontraktu usługi WCF opartego na protokole REST.
  • Zaimplementuj kontrakt WCF oparty na protokole REST.
  • Hostowanie i uruchamianie usługi WCF opartej na protokole REST.
  • Uruchom i przetestuj usługę.

Wymagania wstępne

Do wykonania kroków tego samouczka niezbędne jest spełnienie następujących wymagań wstępnych:

Tworzenie przestrzeni nazw usługi Relay

Aby rozpocząć korzystanie z funkcji przekazywania na platformie Azure, należy najpierw utworzyć przestrzeń nazw usługi. Przestrzeń nazw zapewnia kontener określania zakresu na potrzeby adresowania zasobów platformy Azure w aplikacji. Postępuj zgodnie z instrukcjami podanymi w tym miejscu, aby utworzyć przestrzeń nazw przekazywania.

Definiowanie kontraktu usługi WCF opartego na protokole REST do użycia z usługą Azure Relay

Podczas tworzenia usługi WCF w stylu REST należy zdefiniować kontrakt. Kontrakt określa operacje obsługiwane przez hosta. Operacja usługi przypomina metodę usługi internetowej. Zdefiniuj kontrakt za pomocą interfejsu C++, C# lub Visual Basic. Każda metoda w interfejsie odpowiada określonej operacji usługi. Zastosuj atrybut ServiceContractAttribute do każdego interfejsu i zastosuj atrybut OperationContractAttribute do każdej operacji.

Porada

Jeśli metoda w interfejsie z atrybutem ServiceContractAttribute nie ma atrybutu OperationContractAttribute, ta metoda nie jest uwidoczniona. Kod używany do tych zadań pojawia się w przykładzie poniżej procedury.

Podstawową różnicą między kontraktem programu WCF a kontraktem w stylu REST jest dodanie właściwości do atrybutu OperationContractAttribute: WebGetAttribute. Ta właściwość umożliwia mapowanie metody w interfejsie na metodę po drugiej stronie interfejsu. W tym przykładzie użyto atrybutu WebGetAttribute , aby połączyć metodę z HTTP GET. Takie podejście umożliwia usłudze Service Bus dokładne pobieranie i interpretowanie poleceń wysyłanych do interfejsu.

Aby utworzyć kontrakt z interfejsem

  1. Uruchom program Microsoft Visual Studio jako administrator. W tym celu kliknij prawym przyciskiem myszy ikonę programu Visual Studio i wybierz polecenie Uruchom jako administrator.

  2. W programie Visual Studio wybierz pozycję Utwórz nowy projekt.

  3. W obszarze Utwórz nowy projekt wybierz pozycję Aplikacja konsolowa (.NET Framework) dla języka C#, a następnie wybierz przycisk Dalej.

  4. Nadaj projektowi nazwę ImageListener. Użyj domyślnej lokalizacji, a następnie wybierz pozycję Utwórz.

    W przypadku projektu w języku C# program Visual Studio tworzy plik Program.cs . Ta klasa zawiera pustą metodę Main() wymaganą do prawidłowej kompilacji projektu aplikacji konsolowej.

  5. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt ImageListener, a następnie wybierz pozycję Zarządzaj pakietami NuGet.

  6. Wybierz pozycję Przeglądaj, a następnie wyszukaj i wybierz pozycję WindowsAzure.ServiceBus. Wybierz pozycję Zainstaluj i zaakceptuj warunki użytkowania.

    Ten krok dodaje odwołania do usługi Service Bus i System.ServiceModel.dll. Ten pakiet automatycznie dodaje odwołania do bibliotek usługi Service Bus i programu WCF System.ServiceModel.

  7. Jawnie dodaj odwołanie do System.ServiceModel.Web.dll projektu. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję Odwołania w folderze projektu, a następnie wybierz pozycję Dodaj odwołanie.

  8. W obszarze Dodaj odwołanie wybierz pozycję Framework i wprowadź ciąg System.ServiceModel.Web w polu Wyszukaj. Zaznacz pole wyboru System.ServiceModel.Web , a następnie wybierz przycisk OK.

Następnie wprowadź następujące zmiany w kodzie w projekcie:

  1. Dodaj następujące using instrukcje w górnej części pliku Program.cs .

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    using System.IO;
    
    • System.ServiceModel jest przestrzenią nazw umożliwiającą programowy dostęp do podstawowych funkcji usługi WCF. Przekaźnik WCF używa wielu obiektów i atrybutów programu WCF do definiowania kontraktów usług. Ta przestrzeń nazw jest używana w większości aplikacji przekaźnika.
    • System.ServiceModel.Channels pomaga zdefiniować kanał, który jest obiektem, za pomocą którego komunikujesz się z usługą Azure Relay i przeglądarką internetową klienta.
    • System.ServiceModel.Web zawiera typy, które umożliwiają tworzenie aplikacji internetowych.
  2. ImageListener Zmień nazwę przestrzeni nazw na Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  3. Bezpośrednio po otwarciu nawiasu klamrowego deklaracji przestrzeni nazw zdefiniuj nowy interfejs o nazwie IImageContract i zastosuj ServiceContractAttribute atrybut do interfejsu z wartością https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1.

    [ServiceContract(Name = "ImageContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1")]
    public interface IImageContract
    {
    }
    

    Wartość przestrzeni nazw różni się od przestrzeni nazw używanej w kodzie. Wartość przestrzeni nazw jest unikatowym identyfikatorem dla tego kontraktu i powinna zawierać informacje o wersji. Aby uzyskać więcej informacji, zobacz Service Versioning (Obsługa wersji usług). Jawne określenie przestrzeni nazw zapobiega dodawaniu domyślnej wartości przestrzeni nazw do nazwy kontraktu.

  4. W interfejsie IImageContract zadeklaruj metodę dla pojedynczej operacji uwidacznianej IImageContract przez kontrakt w interfejsie i zastosuj OperationContract atrybut do metody, którą chcesz uwidocznić w ramach publicznego kontraktu usługi Service Bus.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  5. W atrybucie OperationContract dodaj WebGet wartość .

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

    WebGet Dodanie wartości umożliwia usłudze przekazywania kierowanie żądań HTTP GET do GetImageelementu i tłumaczenie zwracanych GetImage wartości na HTTP GETRESPONSE odpowiedź. W dalszej części samouczka użyjesz przeglądarki internetowej, aby uzyskać dostęp do tej metody i wyświetlić obraz w przeglądarce.

  6. Bezpośrednio po definicji IImageContract zadeklaruj kanał dziedziczący z interfejsów IImageContract i IClientChannel.

    public interface IImageChannel : IImageContract, IClientChannel { }
    

    Kanał jest obiektem usługi WCF, za pomocą którego usługa i klient przekazują do siebie informacje. Później utworzysz kanał w aplikacji hosta. Następnie usługa Azure Relay używa tego kanału do przekazywania żądań HTTP GET z przeglądarki do GetImage implementacji. Przekaźnik używa również kanału, aby pobrać wartość zwracaną GetImage i przetłumaczyć ją na HTTP GETRESPONSE wartość dla przeglądarki klienta.

  7. Wybierz pozycję Kompiluj>rozwiązanie kompilacji , aby potwierdzić dokładność pracy do tej pory.

Przykład definiujący kontrakt przekaźnika WCF

Poniższy kod przedstawia podstawowy interfejs, który definiuje kontrakt przekaźnika 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)
        {
        }
    }
}

Implementowanie kontraktu usługi WCF opartego na protokole REST

Aby utworzyć usługę WCF Relay w stylu REST, najpierw utwórz kontrakt przy użyciu interfejsu. Następnym krokiem jest zaimplementowanie interfejsu. Ta procedura obejmuje utworzenie klasy o nazwie ImageService , która implementuje interfejs zdefiniowany przez IImageContract użytkownika. Po zaimplementowaniu kontraktu należy skonfigurować interfejs przy użyciu pliku App.config . Plik konfiguracji zawiera niezbędne informacje dotyczące aplikacji. Te informacje obejmują nazwę usługi, nazwę kontraktu oraz typ protokołu używanego do komunikowania się z usługą przekazywania. Kod używany do tych zadań pojawia się w przykładzie poniżej procedury.

Podobnie jak w poprzednich krokach, nie ma różnicy między implementacją kontraktu w stylu REST a kontraktem przekaźnika WCF.

Aby zaimplementować kontrakt usługi Service Bus oparty na interfejsie REST

  1. Utwórz nową klasę o nazwie ImageService bezpośrednio po definicji interfejsu IImageContract. Klasa ImageService implementuje interfejs IImageContract.

    class ImageService : IImageContract
    {
    }
    

    Podobnie jak w przypadku innych implementacji interfejsów, można zaimplementować definicję w innym pliku. Jednak w przypadku tego samouczka implementację umieszczono w tym samym pliku, w którym znajduje się definicja interfejsu i metoda Main().

  2. Zastosuj atrybut ServiceBehaviorAttribute do IImageService klasy, aby wskazać, że klasa jest implementacją kontraktu WCF.

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

    Jak wspomniano wcześniej, ta przestrzeń nazw nie jest tradycyjną przestrzenią nazw. Jest to część architektury WCF, która identyfikuje kontrakt. Aby uzyskać więcej informacji, zobacz Nazwy kontraktów danych.

  3. Dodaj obraz .jpg do projektu. Ten plik jest obrazem wyświetlanym przez usługę w przeglądarce odbieranej.

    1. Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj.
    2. Następnie wybierz pozycję Istniejący element.
    3. Użyj pozycji Dodaj istniejący element , aby przejść do odpowiedniego .jpg, a następnie wybierz pozycję Dodaj. Podczas dodawania pliku wybierz pozycję Wszystkie pliki z listy rozwijanej obok pozycji Nazwa pliku.

    W pozostałej części tego samouczka przyjęto założenie, że nazwa obrazu to image.jpg. Jeśli masz inny plik, musisz zmienić nazwę obrazu lub zmienić kod, aby zrekompensować.

  4. Aby upewnić się, że uruchomiona usługa może znaleźć plik obrazu, w Eksplorator rozwiązań kliknij prawym przyciskiem myszy plik obrazu, a następnie wybierz polecenie Właściwości. W obszarze Właściwości ustaw opcję Kopiuj do katalogu wyjściowego , aby skopiować, jeśli nowsze.

  5. Użyj procedury w sekcji Aby utworzyć kontrakt z interfejsem , aby dodać odwołanie do zestawu System.Drawing.dll do projektu.

  6. Dodaj następujące skojarzone using instrukcje:

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
  7. ImageService W klasie dodaj następujący konstruktor, który ładuje mapę bitową i przygotowuje ją do wysłania do przeglądarki klienta:

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
  8. Bezpośrednio po poprzednim kodzie dodaj następującą GetImage metodę w ImageService klasie , aby zwrócić komunikat HTTP zawierający obraz.

    public Stream GetImage()
    {
        MemoryStream stream = new MemoryStream();
        this.bitmap.Save(stream, ImageFormat.Jpeg);
    
        stream.Position = 0;
        WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
    
        return stream;
    }
    

    Ta implementacja służy MemoryStream do pobierania obrazu i przygotowywania go do przesyłania strumieniowego do przeglądarki. Uruchamia położenie strumienia na zero, deklaruje zawartość strumienia jako .jpgi przesyła strumieniowo informacje.

  9. Wybierz pozycjęKompiluj rozwiązanie kompilacji>.

Aby zdefiniować konfigurację uruchamiania usługi sieci Web w usłudze Service Bus

  1. W Eksplorator rozwiązań kliknij dwukrotnie App.config, aby otworzyć plik w edytorze programu Visual Studio.

    Plik App.config zawiera nazwę usługi, punkt końcowy i powiązanie. Punkt końcowy to lokalizacja uwidacznianą przez usługę Azure Relay dla klientów i hostów w celu komunikowania się ze sobą. Powiązanie jest typem protokołu używanego do komunikacji. Główną różnicą jest to, że skonfigurowany punkt końcowy usługi odwołuje się do powiązania WebHttpRelayBinding .

  2. Element XML <system.serviceModel> jest elementem usługi WCF definiującym co najmniej jedną usługę. W tym miejscu służy do definiowania nazwy usługi i punktu końcowego. W dolnej części elementu, ale nadal w elemecie <system.serviceModel><system.serviceModel>dodaj <bindings> element o następującej zawartości:

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

    Ta zawartość definiuje powiązania używane w aplikacji. Można zdefiniować wiele powiązań, ale na potrzeby tego samouczka definiujesz tylko jedno.

    Poprzedni kod definiuje powiązanie WebHttpRelayBinding przekaźnika WCF z ustawioną wartością relayClientAuthenticationTypeNone. To ustawienie oznacza, że punkt końcowy korzystający z tego powiązania nie wymaga poświadczeń klienta.

  3. Po elemencie <bindings> dodaj element <services>. Podobnie jak w przypadku powiązań, w pojedynczym pliku konfiguracji można zdefiniować wiele usług. Jednak w tym samouczku definiowana jest tylko jedna.

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

    Ta zawartość konfiguruje usługę, która używa wcześniej zdefiniowanej domyślnej wartości webHttpRelayBinding. Używa również wartości domyślnej sbTokenProvider, która jest zdefiniowana w następnym kroku.

  4. Po elemecie <services> utwórz <behaviors> element z następującą zawartością, zastępując SAS_KEY element kluczem sygnatury dostępu współdzielonego (SAS). Aby uzyskać klucz SYGNATURy dostępu współdzielonego z Azure Portal, zobacz Uzyskiwanie poświadczeń zarządzania.

    <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. Nadal w App.configw elemencie <appSettings> zastąp całą wartość parametrów połączenia parametrami połączenia uzyskanymi wcześniej z portalu.

    <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. Wybierz pozycjęKompiluj rozwiązanie kompilacji>, aby skompilować całe rozwiązanie.

Przykład implementujący kontrakt usługi WCF oparty na protokole REST

Poniższy kod przedstawia kontrakt i implementację usługi dla usługi opartej na protokole REST uruchomionej w usłudze Service Bus przy użyciu WebHttpRelayBinding powiązania.

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)
        {
        }
    }
}

W poniższym przykładzie pokazano plik App.config skojarzony z usługą.

<?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>

Hostowanie usługi WCF opartej na protokole REST do korzystania z usługi Azure Relay

W tej sekcji opisano sposób uruchamiania usługi internetowej przy użyciu aplikacji konsolowej z przekaźnikiem WCF. Pełna lista kodu napisanego w tej sekcji zostanie wyświetlona w przykładzie poniżej procedury.

Aby utworzyć podstawowy adres usługi

  1. W deklaracji Main() funkcji utwórz zmienną do przechowywania przestrzeni nazw projektu. Pamiętaj, aby zastąpić yourNamespace ciąg nazwą utworzonej wcześniej przestrzeni nazw usługi Relay.

    string serviceNamespace = "yourNamespace";
    

    Usługa Service Bus używa przestrzeni nazw do utworzenia unikatowego identyfikatora URI.

  2. Utwórz wystąpienie identyfikatora Uri dla podstawowego adresu usługi, która jest oparta na tej przestrzeni nazw.

    Uri address = ServiceBusEnvironment.CreateServiceUri("https", serviceNamespace, "Image");
    

Aby utworzyć i skonfigurować hosta usługi sieci Web

Nadal w Main()programie utwórz hosta usługi internetowej przy użyciu adresu URI utworzonego wcześniej w tej sekcji.

WebServiceHost host = new WebServiceHost(typeof(ImageService), address);

Host usługi jest obiektem usługi WCF tworzącym wystąpienie aplikacji hosta. W tym przykładzie przekazuje typ hosta, który chcesz utworzyć, czyli ImageServiceadres, pod którym chcesz uwidocznić aplikację hosta.

Aby uruchomić hosta usługi sieci Web

  1. Nadal w Main()pliku dodaj następujący wiersz, aby otworzyć usługę.

    host.Open();
    

    Usługa jest teraz uruchomiona.

  2. Wyświetl komunikat z informacją, że usługa jest uruchomiona, oraz informacją o sposobie zatrzymania usługi.

    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 zakończeniu zamknij hosta usługi.

    host.Close();
    

Przykład kontraktu usługi i implementacji

Poniższy przykład zawiera kontrakt usługi i implementację z poprzednich kroków samouczka i hostuje usługę w aplikacji konsolowej. Skompiluj następujący kod do pliku wykonywalnego o nazwie 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();
        }
    }
}

Uruchamianie i testowanie usługi

Po utworzeniu rozwiązania należy wykonać następujące polecenie, aby uruchomić aplikację:

  1. Wybierz klawisz F5 lub przejdź do lokalizacji pliku wykonywalnego ImageListener\bin\Debug\ImageListener.exe, aby uruchomić usługę. Zachowaj działanie aplikacji, ponieważ jest ona wymagana do następnego kroku.
  2. Skopiuj i wklej adres z wiersza polecenia do przeglądarki, aby wyświetlić obraz.
  3. Po zakończeniu wybierz klawisz Enter w oknie wiersza polecenia, aby zamknąć aplikację.

Następne kroki

Po utworzeniu aplikacji korzystającej z usługi Azure Relay zapoznaj się z następującymi artykułami, aby dowiedzieć się więcej: