Megosztás a következőn keresztül:


Oktatóanyag: Azure WCF Relay REST oktatóanyag

Ez az oktatóanyag bemutatja, hogyan hozhat létre egy REST-alapú felületet elérhetővé tevő Azure Relay-gazdaalkalmazást. A REST lehetővé teszi egy webes ügyfél, például egy webes böngésző számára, hogy hozzáférjen a HTTP-kérelmeken keresztül a Service Bus alkalmazásprogramozási felületekhez.

Az oktatóanyag a Windows Communication Foundation (WCF) REST programozási modelljét használja REST-szolgáltatás létrehozásához az Azure Relayben. További információ: WCF REST programozási modell és tervezési és implementálási szolgáltatások.

Ebben az oktatóanyagban a következő feladatokat hajtja végre:

  • Az oktatóanyag előfeltételeinek telepítése.
  • Hozzon létre egy Relay-névteret.
  • Hozzon létre egy REST-alapú WCF-szolgáltatási szerződést.
  • Implementálja a REST-alapú WCF-szerződést.
  • Üzemelteti és futtatja a REST-alapú WCF szolgáltatást.
  • Futtassa és tesztelje a szolgáltatást.

Előfeltételek

Az oktatóanyag teljesítéséhez a következő előfeltételekre lesz szüksége:

Relay-névtér létrehozása

A Relay-funkciók Azure-ban való használatához először létre kell hoznia egy szolgáltatásnévteret. A névtér egy hatókörkezelési tárolót biztosít az Azure erőforrásainak címzéséhez az alkalmazáson belül. Relay-névtér létrehozásához kövesse az itt leírt utasításokat.

REST-alapú WCF-szolgáltatási szerződés definiálása az Azure Relay használatával

WCF REST-stílusú szolgáltatás létrehozásakor meg kell határoznia a szerződést. A szerződés megadja a gazdagép által támogatott műveleteket. A szolgáltatásművelet hasonlít egy webszolgáltatás-metódusra. C++, C#vagy Visual Basic felülettel rendelkező szerződést definiálhat. A felület minden metódusa egy konkrét szolgáltatási műveletnek felel meg. Alkalmazza a ServiceContractAttribute attribútumot az egyes felületekre, és alkalmazza az OperationContractAttribute attribútumot az egyes műveletekre.

Tipp

Ha egy ServiceContractAttribute nevű felületen található metódus nem rendelkezik az OperationContractAttribute művelettel, a metódus nem lesz közzétéve. Az ezekhez a feladatokhoz használt kód az eljárást követő példában jelenik meg.

A WCF-szerződés és a REST-stílusú szerződés közötti elsődleges különbség egy tulajdonság hozzáadása az OperationContractAttribute: WebGetAttribute függvényhez. Ez a tulajdonság lehetővé teszi a felület egy metódusának leképezését egy, a felület másik oldalán levő metódussá. Ez a példa a WebGetAttribute attribútumot használja a metódus és a metódus összekapcsolásához HTTP GET. Ez a megközelítés lehetővé teszi, hogy a Service Bus pontosan lekérje és értelmezze a felületre küldött parancsokat.

Szerződés létrehozása felülettel

  1. Indítsa el a Microsoft Visual Studiót rendszergazdaként. Ehhez kattintson a jobb gombbal a Visual Studio program ikonjára, és válassza a Futtatás rendszergazdaként parancsot.

  2. A Visual Studióban válassza az Új projekt létrehozása lehetőséget.

  3. Az Új projekt létrehozása területen válassza a Konzolalkalmazás (.NET-keretrendszer) lehetőséget a C# számára, és válassza a Tovább gombot.

  4. Nevezze el a projektet ImageListener néven. Használja az alapértelmezett helyet, majd válassza a Létrehozás lehetőséget.

    C#-projekt esetén a Visual Studio létrehoz egy Program.cs fájlt. Ez az osztály tartalmaz egy üres Main() metódust, amely szükséges a konzolalkalmazás projektek helyes létrejöttéhez.

  5. A Megoldáskezelőben kattintson a jobb gombbal az ImageListener projektre , majd válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.

  6. Válassza a Tallózás lehetőséget, majd keressen rá, és válassza a WindowsAzure.ServiceBus lehetőséget. Válassza a Telepítés lehetőséget, és fogadja el a használati feltételeket.

    Ez a lépés a Service Busra és aSystem.ServiceModel.dllhivatkozásokat ad hozzá. Ez a csomag automatikusan hozzáad hivatkozásokat a Service Bus-kódtárakhoz és a WCF-hez System.ServiceModel.

  7. Explicit módon adjon hozzá egy hivatkozást a projekthez System.ServiceModel.Web.dll . A Megoldáskezelőben kattintson a jobb gombbal a projektmappában a Hivatkozások elemre, és válassza a Hivatkozás hozzáadása lehetőséget.

  8. A Hivatkozás hozzáadása területen válassza a Keretrendszer lehetőséget, és írja be a System.ServiceModel.Web kifejezést a Keresés mezőbe. Jelölje be a System.ServiceModel.Web jelölőnégyzetet, majd kattintson az OK gombra.

Ezután végezze el a következő kódmódosításokat a projekten:

  1. Adja hozzá az alábbi using utasításokat a Program.cs fájl tetején.

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    using System.IO;
    
    • A System.ServiceModel az a névtér, amely lehetővé teszi a programozott hozzáférést a WCF alapszintű szolgáltatásaihoz. A WCF Relay a WCF számos objektumát és attribútumát használja a szolgáltatási szerződések meghatározásához. Ezt a névteret használja a legtöbb továbbítóalkalmazásban.
    • A System.ServiceModel.Channels segít meghatározni a csatornát, amely az az objektum, amelyen keresztül kommunikál az Azure Relayrel és az ügyfél webböngészőjével.
    • A System.ServiceModel.Web tartalmazza azokat a típusokat, amelyek lehetővé teszik a webalapú alkalmazások létrehozását.
  2. Nevezze át a névteret a ImageListener következőre: Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  3. Közvetlenül a névtér deklarációjának nyitó kapcsos zárójele után adjon meg egy új nevű felületet IImageContract , és alkalmazza az ServiceContractAttribute attribútumot a felületre a következő https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1értékkel: .

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

    A névtér értéke különbözik a kód tartományában használt névtértől. A névtér értéke a szerződés egyedi azonosítója, és verzióinformációval kell rendelkeznie. További információ: Service Versioning (Szolgáltatás verziószámozása). A névtér explicit meghatározásával megelőzhető az alapértelmezett névtér hozzáadása a szerződésnévhez.

  4. IImageContract Az interfészen belül deklaráljon egy metódust arra az egyetlen műveletre, amelyet a IImageContract szerződés elérhetővé tesz a felületen, és alkalmazza az OperationContract attribútumot arra a metódusra, amelyet a nyilvános Service Bus-szerződés részeként közzé szeretne tenni.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  5. Az attribútumban OperationContract adja hozzá az WebGet értéket.

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

    Az érték hozzáadásával a WebGet továbbító szolgáltatás átirányíthatja a HTTP GET-kéréseket GetImagea () címre, és lefordíthatja a visszaadott GetImage értékeket válaszként HTTP GETRESPONSE . Az oktatóanyag későbbi részében egy webböngészővel fogja elérni ezt a módszert, és megjelenítheti a képet a böngészőben.

  6. Közvetlenül az IImageContract definíciója után deklaráljon egy csatornát, amely örökli az IImageContract és az IClientChannel felületek tulajdonságait is.

    public interface IImageChannel : IImageContract, IClientChannel { }
    

    A csatorna egy olyan WCF-objektum, amelyen keresztül a szolgáltatás és az ügyfél információkat adnak át egymásnak. Később létrehozza a csatornát a gazdaalkalmazásban. Az Azure Relay ezt a csatornát használja a HTTP GET-kérések böngészőből a megvalósításba való továbbításához GetImage . A továbbító a csatornát is használja a visszatérési GetImage érték levételéhez, és lefordítja az ügyfélböngészőhöz HTTP GETRESPONSE .

  7. Válassza aBuild Solution (Buildmegoldáslétrehozása>) lehetőséget a munkája eddigi pontosságának megerősítéséhez.

WcF Relay-szerződést definiáló példa

Az alábbi kód egy alapszintű felületet mutat be, amely meghatároz egy WCF Relay-szerződést.

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

A REST-alapú WCF szolgáltatási szerződés implementálása

REST-stílusú WCF Relay szolgáltatás létrehozásához először hozzon létre egy szerződést egy interfész használatával. A következő lépés a felület megvalósítása. Ebben az eljárásban létre kell hozni egy nevű ImageService osztályt, amely implementálja a felhasználó által definiált IImageContract felületet. A szerződés implementálása után konfigurálja a felületet egy App.config fájllal. A konfigurációs fájl tartalmazza az alkalmazáshoz szükséges információkat. Ezek az információk tartalmazzák a szolgáltatás nevét, a szerződés nevét és a továbbító szolgáltatással való kommunikációhoz használt protokoll típusát. Az ezekhez a feladatokhoz használt kód az eljárást követő példában jelenik meg.

Az előző lépésekhez hasonlóan a REST-stílusú szerződés és a WCF Relay-szerződés megvalósítása között nincs különbség.

REST-stílusú Service Bus szerződés megvalósítása

  1. Hozzon létre egy új, ImageService nevű osztályt közvetlenül az IImageContract felület meghatározása után. Az ImageService osztály megvalósítja az IImageContract felületet.

    class ImageService : IImageContract
    {
    }
    

    Hasonlóan az egyéb felületi megvalósításokhoz, a definíciót megvalósíthatja egy másik fájlban. Ebben az oktatóanyagban azonban a megvalósítás ugyanabban a fájlban jelenik meg, mint a felületdefiníció és a Main() metódus.

  2. Alkalmazza a ServiceBehaviorAttribute attribútumot a IImageService osztályra annak jelzésére, hogy az osztály egy WCF-szerződés implementációja.

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

    Ahogy korábban említettük, ez a névtér nem hagyományos névtér. Ez a WCF-architektúra része, amely azonosítja a szerződést. További információ: Adatszerződések nevei.

  3. Adjon hozzá egy.jpg képet a projekthez. Ez a fájl egy kép, amelyet a szolgáltatás megjelenít a fogadó böngészőben.

    1. Kattintson a jobb gombbal a projektre, és válassza a Hozzáadás lehetőséget.
    2. Ezután válassza a Meglévő elem lehetőséget.
    3. A Meglévő elem hozzáadása paranccsel keresse meg a megfelelő .jpg, majd válassza a Hozzáadás lehetőséget. A fájl hozzáadásakor válassza a Minden fájl lehetőséget a Fájlnév melletti legördülő listából.

    Az oktatóanyag többi része feltételezi, hogy a rendszerkép neve image.jpg. Ha más fájllal rendelkezik, át kell neveznie a képet, vagy módosítania kell a kódot a kompenzálás érdekében.

  4. Annak biztosításához, hogy a futó szolgáltatás megtalálja a képfájlt, a Megoldáskezelőben kattintson a jobb gombbal a képfájlra, majd válassza a Tulajdonságok parancsot. A Tulajdonságok területen állítsa a Másolás kimeneti könyvtárra beállítást Másolás, ha újabb értékre.

  5. A Szerződés létrehozása felülettel című témakör eljárásával hivatkozást adhat a System.Drawing.dll szerelvényhez a projekthez.

  6. Adja hozzá a következő társított using utasításokat:

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
  7. A osztályban adja hozzá a ImageService következő konstruktort, amely betölti a bitképet, és előkészíti, hogy elküldje azt az ügyfélböngészőnek:

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
  8. Közvetlenül az előző kód után adja hozzá a következő GetImage metódust a osztályhoz a ImageService képet tartalmazó HTTP-üzenet visszaadásához.

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

    Ez az implementáció a rendszerkép lekérésére és a böngészőben való streamelésre való előkészítésére használja MemoryStream . A stream pozíciója nulla, deklarálja a streamtartalmat .jpg, és streameli az információkat.

  9. Válassza aBuild Solution (Buildelési megoldás létrehozása>) lehetőséget.

A konfiguráció meghatározása a webszolgáltatás Service Buson való futtatásához

  1. A Megoldáskezelőben kattintson duplán aApp.config elemre a fájl Visual Studio-szerkesztőben való megnyitásához.

    A App.config fájl tartalmazza a szolgáltatásnevet, a végpontot és a kötést. A végpont az a hely, amelyet az Azure Relay elérhetővé tesz az ügyfelek és a gazdagépek számára, hogy kommunikáljanak egymással. A kötés a kommunikációhoz használt protokoll típusa. A fő különbség az, hogy a konfigurált szolgáltatásvégpont egy WebHttpRelayBinding kötésre hivatkozik .

  2. A <system.serviceModel> XML-elem egy WCF-elem, amely egy vagy több szolgáltatást határoz meg. Itt a szolgáltatásnév és a végpont definiálására szolgál. Az elem alján, de még mindig a <system.serviceModel> elemen belül <system.serviceModel>adjon hozzá egy <bindings> elemet, amely a következő tartalommal rendelkezik:

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

    Ez a tartalom határozza meg az alkalmazásban használt kötéseket. Több kötést is definiálhat, de ebben az oktatóanyagban csak egyet definiál.

    Az előző kód egy WCF Relay WebHttpRelayBinding kötést definiál, amelynek relayClientAuthenticationType értéke .None Ez a beállítás azt jelzi, hogy a kötést használó végponthoz nincs szükség ügyfél-hitelesítő adatokra.

  3. A <bindings> elem után adjon hozzá egy <services> elemet. A kötésekhez hasonlóan megadhat több szolgáltatást is egyetlen konfigurációs fájlon belül. Ez az oktatóanyag azonban csak egyet ad meg.

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

    Ez a tartalom olyan szolgáltatást konfigurál, amely a korábban definiált alapértelmezettet webHttpRelayBindinghasználja. Emellett az alapértelmezettet sbTokenProvideris használja, amely a következő lépésben van definiálva.

  4. <services> Az elem után hozzon létre egy <behaviors> elemet a következő tartalommal, és cserélje le a elemet SAS_KEY a közös hozzáférésű jogosultságkód (SAS) kulcsra. Ha SAS-kulcsot szeretne beszerezni a Azure Portal, olvassa el a Felügyeleti hitelesítő adatok lekérése című témakört.

    <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. Továbbra is App.configelemben <appSettings> cserélje le a teljes kapcsolati sztring értéket a portálról korábban beszerzett kapcsolati sztring.

    <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. A teljes megoldás létrehozásához válassza aBuild Solution (Buildelési> megoldás létrehozása) lehetőséget.

Példa a REST-alapú WCF szolgáltatási szerződés implementálására

Az alábbi kód egy Service Buson futó REST-alapú szolgáltatás szerződését és szolgáltatás-implementációját mutatja be a WebHttpRelayBinding kötés használatával.

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

Az alábbi példa a szolgáltatáshoz társított App.config fájlt mutatja be.

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

A REST-alapú WCF szolgáltatás üzemeltetése az Azure Relay használatához

Ez a szakasz azt ismerteti, hogyan futtathat webszolgáltatást egy konzolalkalmazással a WCF Relayrel. Az eljárás utáni példában megjelenik az ebben a szakaszban írt kód teljes listája.

Alapszintű cím létrehozása a szolgáltatáshoz

  1. Main() A függvénydeklarációban hozzon létre egy változót a projekt névterének tárolásához. Ügyeljen arra, hogy a helyére yourNamespace írja be a korábban létrehozott Relay-névtér nevét.

    string serviceNamespace = "yourNamespace";
    

    A Service Bus a névtér nevét használva létrehoz egy egyedi URI-t.

  2. Hozzon létre egy Uri-példányt a névtéren alapuló szolgáltatás alapszintű címéhez.

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

A webszolgáltatásgazda létrehozása és konfigurálása

A fájlban Main()továbbra is hozza létre a webszolgáltatás-gazdagépet a szakasz korábbi részében létrehozott URI-cím használatával.

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

A szolgáltatásgazda az a WCF-objektum, amely a gazdaalkalmazást példányosítja. Ez a példa átadja a létrehozni kívánt gazdagép típusát, amely egy ImageService, és azt a címet is, amelyen elérhetővé szeretné tenni a gazdagépalkalmazást.

A webszolgáltatásgazda futtatása

  1. A fájlban Main()továbbra is adja hozzá a következő sort a szolgáltatás megnyitásához.

    host.Open();
    

    A szolgáltatás jelenleg fut.

  2. Megjelenít egy üzenetet, amely jelzi, hogy a szolgáltatás fut, valamint a szolgáltatás leállításának módját.

    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. Ha kész, zárja be a szolgáltatásgazdát.

    host.Close();
    

Példa a szolgáltatási szerződésre és a megvalósításra

Az alábbi példa tartalmazza a szolgáltatási szerződést és a megvalósítását az oktatóanyag előző lépéseiből, és egy konzolalkalmazásban működteti a szolgáltatást. Fordítsa le a következő kódot egy ImageListener.exenevű végrehajtható fájlra.

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();
        }
    }
}

A szolgáltatás futtatása és tesztelése

A megoldás létrehozása után az alábbi lépéseket követve futtathatja az alkalmazást:

  1. A szolgáltatás futtatásához válassza az F5 lehetőséget, vagy keresse meg a végrehajtható fájl helyét ( ImageListener\bin\Debug\ImageListener.exe). Futtassa az alkalmazást, mert a következő lépéshez szükség van rá.
  2. A kép megtekintéséhez másolja és illessze be a címet a parancssorból egy böngészőbe.
  3. Ha végzett, a parancssori ablakban kattintson az Enter gombra az alkalmazás bezárásához.

Következő lépések

Most, hogy létrehozott egy alkalmazást, amely az Azure Relay szolgáltatást használja, további információért tekintse meg az alábbi cikkeket: