Bagikan melalui


Tutorial: Tutorial Azure Relai WCF REST

Tutorialini menjelaskan cara membuat aplikasi host Azure Relay yang mengekspos antarmuka berbasis REST. REST memungkinkan klien web, seperti browser web, untuk mengakses API Bus Layanan melalui permintaan HTTP.

Tutorial ini menggunakan model pemrograman REST Windows Communication Foundation (WCF) untuk membangun layanan REST di Azure Relay. Untuk informasi selengkapnya, lihat Model Pemrograman WCF REST dan Layanan Desain dan Penerapan.

Anda melakukan tugas-tugas berikut dalam tutorial ini:

  • Instal prasyarat untuk tutorial ini adalah.
  • Buat namespace Relay.
  • Tentukan kontrak layanan WCF berbasis REST.
  • Menerapkan kontrak WCF berbasis REST.
  • Host dan jalankan layanan WCF berbasis REST.
  • Jalankan dan uji layanan.

Prasyarat

Untuk menyelesaikan tutorial ini, Anda memerlukan prasyarat berikut:

Buat namespace Relay

Untuk mulai menggunakan fitur relai di Azure, Anda harus membuat ruang nama layanan terlebih dahulu. Namespace menyediakan kontainer pelingkup untuk mengatasi sumber daya bus layanan Azure dalam aplikasi Anda. Ikuti instruksi di sini untuk membuat namespace Relay.

Tentukan kontrak layanan WCF berbasis REST untuk digunakan dengan Azure Relay

Ketika Anda membuat layanan bergaya WCF REST, Anda harus menentukan kontrak. Kontrak menentukan operasi apa yang didukung tuan rumah. Operasi layanan menyerupai metode layanan web. Tentukan kontrak dengan antarmuka C++, C#, atau Visual Basic. Setiap metode di antarmuka sesuai dengan operasi layanan tertentu. Terapkan atribut ServiceContractAttribute ke setiap antarmuka, dan terapkan atribut OperationContractAttribute ke setiap operasi.

Tip

Jika metode dalam antarmuka yang memiliki ServiceContractAttribute tidak memiliki OperationContractAttribute, metode tersebut tidak terekspos. Kode yang digunakan untuk tugas-tugas ini muncul dalam contoh mengikuti prosedur.

Perbedaan utama antara kontrak WCF dan kontrak bergaya REST adalah penambahan properti ke OperationContractAttribute: WebGetAttribute. Properti ini memungkinkan Anda untuk memetakan metode di antarmuka Anda ke metode di sisi lain antarmuka. Contoh ini menggunakan atribut WebGetAttribute untuk menautkan metode ke HTTP GET. Pendekatan ini memungkinkan Bus Layanan untuk mengambil dan menafsirkan perintah yang dikirim ke antarmuka secara akurat.

Untuk membuat kontrak dengan antarmuka

  1. Mulai Microsoft Visual Studio sebagai administrator. Untuk melakukannya, klik kanan ikon program Visual Studio, lalu pilih Jalankan sebagai administrator.

  2. Di Visual Studio, pilih Buat proyek baru.

  3. Di Buat proyek baru, pilih Aplikasi Konsol (.NET Framework) untuk C#, lalu pilih Berikutnya.

  4. Beri nama proyek ImageListener. Gunakan Lokasi default, lalu pilih Buat.

    Untuk proyek C#, Visual Studio membuat file program.cs. Kelas ini berisi metode Main() kosong, yang diperlukan agar proyek aplikasi konsol dapat dibangun dengan benar.

  5. Pada Penjelajah Solusi, klik kanan proyek ImageListener dan pilih Kelola Paket NuGet.

  6. Pilih Telusuri, lalu cari dan pilih WindowsAzure.ServiceBus. Klik Instal, dan terima ketentuan penggunaan.

    Langkah ini menambahkan referensi ke Bus Layanan dan System.ServiceModel.dll. Paket ini menambahkan referensi secara otomatis ke pustaka Bus Layanan dan WCF System.ServiceModel.

  7. Secara eksplisit menambahkan referensi System.ServiceModel.Web.dll ke proyek. Di Penjelajah Solusi, klik kanan Referensi di bawah folder proyek, dan pilih Tambahkan Referensi.

  8. Di Tambahkan Referensi, pilih Kerangka Kerja dan masukkan System.ServiceModel.Web di Pencarian. Pilih kotak centang System.ServiceModel.Web , lalu pilih OK.

Selanjutnya, buat perubahan kode berikut ke proyek:

  1. Tambahkan pernyataan using berikut di atas file Program.cs.

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Web;
    using System.IO;
    
    • System.ServiceModel adalah namespace yang memungkinkan akses terprogram ke fitur dasar WCF. Relai WCF menggunakan banyak objek dan atribut WCF untuk menentukan kontrak layanan. Anda menggunakan namespace ini di sebagian besar aplikasi relai Anda.
    • System.ServiceModel.Channels membantu menentukan saluran, yang merupakan objek tempat Anda berkomunikasi dengan Azure Relay dan browser web klien.
    • System.ServiceModel.Web berisi jenis yang memungkinkan Anda membuat aplikasi berbasis web.
  2. Ganti nama namespace ImageListener menjadi Microsoft.ServiceBus.Samples.

    namespace Microsoft.ServiceBus.Samples
    {
        ...
    
  3. Setelah membuka tanda kurung kurawal dari deklarasi namespace, tentukan antarmuka baru bernama IImageContract dan terapkan atribut ServiceContractAttribute ke antarmuka dengan nilai https://samples.microsoft.com/ServiceModel/Relay/RESTTutorial1.

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

    Nilai namespace berbeda dari namespace yang Anda gunakan di seluruh lingkup kode Anda. Nilai namespace adalah pengidentifikasi unik untuk kontrak ini, dan harus memiliki informasi versi. Untuk informasi selengkapnya, lihat Penerapan Versi Layanan. Menentukan namespace secara eksplisit mencegah nilai namespace default ditambahkan ke nama kontrak.

  4. Dalam antarmuka IImageContract, nyatakan metode untuk operasi tunggal yang diekspos kontrak IImageContract di antarmuka dan terapkan atribut OperationContract ke metode yang ingin Anda ekspos sebagai bagian dari kontrak Bus Layanan publik.

    public interface IImageContract
    {
        [OperationContract]
        Stream GetImage();
    }
    
  5. Di atribut OperationContract, tambahkan nilai WebGet.

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

    Menambahkan nilai WebGet memungkinkan layanan relai untuk merutekan permintaan HTTP GET ke GetImage, dan untuk menerjemahkan nilai pengembalian GetImage menjadi balasan HTTP GETRESPONSE. Kemudian dalam tutorial, Anda akan menggunakan browser web untuk mengakses metode ini, dan untuk menampilkan gambar di browser.

  6. Setelah definisi IImageContract, nyatakan saluran yang mewarisi dari antarmuka IImageContract dan IClientChannel.

    public interface IImageChannel : IImageContract, IClientChannel { }
    

    Saluran adalah objek WCF di mana layanan dan klien meneruskan informasi satu sama lain. Kemudian, Anda membuat saluran di aplikasi host Anda. Azure Relay kemudian menggunakan saluran ini untuk meneruskan permintaan HTTP GET dari browser ke implementasi GetImage Anda. Relai juga menggunakan saluran untuk mengambil nilai pengembalian GetImage dan menerjemahkannya menjadi HTTP GETRESPONSE untuk browser klien.

  7. Pilih Build>Solusi Build untuk mengonfirmasi keakuratan pekerjaan Anda sejauh ini.

Contoh yang mendefinisikan kontrak Relai WCF

Kode berikut menunjukkan antarmuka dasar yang mendefinisikan kontrak Relai 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)
        {
        }
    }
}

Menerapkan kontrak WCF berbasis REST

Untuk membuat layanan Relai WCF gaya REST, pertama buat kontrak dengan menggunakan antarmuka. Langkah selanjutnya adalah mengimplementasikan antarmuka. Prosedur ini melibatkan pembuatan kelas bernama ImageService yang mengimplementasikan antarmuka IImageContract yang ditentukan oleh pengguna. Setelah menerapkan kontrak, Anda kemudian mengonfigurasi antarmuka dengan menggunakan file App.config. File konfigurasi berisi informasi yang diperlukan untuk aplikasi. Informasi ini mencakup nama layanan, nama kontrak, dan jenis protokol yang digunakan untuk berkomunikasi dengan layanan relai. Kode yang digunakan untuk tugas-tugas ini muncul dalam contoh mengikuti prosedur.

Seperti langkah-langkah sebelumnya, ada sedikit perbedaan antara menerapkan kontrak gaya REST dan kontrak Relai WCF.

Untuk mengimplementasikan kontrak Bus Layanan bergaya REST

  1. Buat kelas baru bernama ImageService setelah definisi antarmuka IImageContract. Kelas ImageService menerapkan antarmuka IImageContract.

    class ImageService : IImageContract
    {
    }
    

    Mirip dengan implementasi antarmuka lainnya, Anda dapat menerapkan definisi tersebut dalam file yang berbeda. Namun, untuk tutorial ini, implementasi muncul dalam file yang sama dengan definisi antarmuka dan metode Main().

  2. Terapkan atribut ServiceBehaviorAttribute ke kelas IImageService untuk menunjukkan bahwa kelas adalah implementasi dari kontrak WCF.

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

    Seperti yang disebutkan sebelumnya, namespace ini bukanlah namespace tradisional. Ini adalah bagian dari arsitektur WCF yang mengidentifikasi kontrak. Untuk informasi selengkapnya, lihat Nama Kontrak Data.

  3. Tambahkan gambar .jpg ke proyek Anda. File ini adalah gambar yang ditampilkan layanan di browser penerima.

    1. Klik kanan proyek Anda, dan pilih Tambahkan.
    2. Lalu pilih Item yang Ada.
    3. Gunakan Tambahkan Item yang Ada untuk menelusuri ke .jpg yang sesuai, lalu pilih Tambahkan. Saat menambahkan file, pilih Semua File dari daftar menurun di samping Nama file.

    Sisa tutorial ini mengasumsikan bahwa nama gambar adalah image.jpg. Jika Anda memiliki file yang berbeda, Anda harus mengganti nama gambar, atau mengubah kode Anda untuk mengimbanginya.

  4. Untuk memastikan bahwa layanan yang sedang berjalan dapat menemukan file gambar, di Penjelajah Solusi klik kanan file gambar, lalu pilih Properti. Di Properti, atur Salin ke Direktori Output ke Disalin jika lebih baru.

  5. Gunakan prosedur dalam Untuk membuat kontrak dengan antarmuka untuk menambahkan referensi ke perakitan System.Drawing.dllke proyek.

  6. Tambahkan pernyataan terkait using berikut:

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
  7. Di kelas ImageService, tambahkan konstruktor berikut yang memuat bitmap dan bersiap untuk mengirimnya ke browser klien:

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
  8. Setelah kode sebelumnya, tambahkan metode GetImage berikut di kelas ImageService untuk mengembalikan pesan HTTP yang berisi gambar.

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

    Implementasi ini digunakan MemoryStream untuk mengambil gambar dan menyiapkannya untuk streaming ke browser. Ini memulai posisi aliran ke nol, mendeklarasikan konten stream sebagai .jpg, dan mengalirkan informasi.

  9. Pilih Build>Solusi Build.

Untuk menentukan konfigurasi guna menjalankan layanan web di Microsoft Azure Service Bus

  1. Di Penjelajah Solusi, klik dua kali App.config untuk membuka file di editor Visual Studio.

    File App.config mencakup nama layanan, titik akhir, dan pengikatan. Titik akhir adalah lokasi yang diekspos Azure Relay untuk klien dan host dapat berkomunikasi satu sama lain. Pengikatan data adalah tipe protokol yang digunakan untuk berkomunikasi. Perbedaan utamanya adalah bahwa titik akhir layanan yang dikonfigurasi mengacu pada pengikatan WebHttpRelayBinding .

  2. Elemen XML <system.serviceModel> adalah elemen WCF yang menentukan satu atau beberapa layanan. Di sini, elemen tersebut digunakan untuk menentukan nama layanan dan titik akhir. Di bawah elemen <system.serviceModel>, tetapi masih di dalam <system.serviceModel>, tambahkan elemen <bindings> yang memiliki konten berikut:

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

    Konten ini mendefinisikan pengikatan yang digunakan dalam aplikasi. Anda dapat menentukan beberapa binding, tetapi untuk tutorial ini Anda hanya mendefinisikan satu.

    Kode sebelumnya mendefinisikan pengikatan WebHttpRelayBinding Relai WCF dengan relayClientAuthenticationType diatur ke None. Pengaturan ini menunjukkan bahwa titik akhir menggunakan pengikatan ini tidak memerlukan info masuk klien.

  3. Setelah elemen <bindings>, tambahkan elemen <services>. Mirip dengan pengikatan, Anda dapat menentukan beberapa layanan dalam satu file konfigurasi. Namun, untuk tutorial ini, Anda hanya mendefinisikan satu.

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

    Konten ini mengonfigurasi layanan yang menggunakan default webHttpRelayBinding yang ditentukan sebelumnya. Ini juga menggunakan default sbTokenProvider, yang didefinisikan di langkah berikutnya.

  4. Setelah elemen <services>, buat elemen <behaviors> dengan konten berikut, mengganti SAS_KEY dengan kunci Tanda Tangan Akses Bersama (SAS). Untuk mendapatkan kunci SAS dari portal Microsoft Azure, lihat Dapatkan info masuk manajemen.

    <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. Masih dalam App.config, dalam elemen <appSettings>, ganti seluruh nilai untaian koneksi dengan string koneksi yang sebelumnya Anda peroleh dari portal.

    <appSettings>
       <!-- Service Bus specific app settings for messaging connections -->
       <add key="Microsoft.ServiceBus.ConnectionString"
           value="Endpoint=sb://yourNamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=YOUR_SAS_KEY"/>
    </appSettings>
    
  6. Pilih Build>Solusi Build untuk membangun seluruh solusi.

Contoh yang mengimplementasikan kontrak layanan WCF berbasis REST

Kode berikut menunjukkan kontrak dan implementasi layanan untuk layanan berbasis REST yang berjalan pada Bus Layanan menggunakan pengikatan 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)
        {
        }
    }
}

Contoh berikut menunjukkan file App.config yang terkait dengan layanan.

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

Hosy layanan WCF berbasis REST untuk menggunakan Azure Relay

Bagian ini menjelaskan cara menjalankan layanan web menggunakan aplikasi konsol dengan Relai WCF. Daftar lengkap kode yang ditulis di bagian ini muncul dalam contoh mengikuti prosedur.

Untuk membuat alamat dasar bagi layanan

  1. Dalam deklarasi fungsi Main(), buat variabel untuk menyimpan namespace proyek Anda. Pastikan untuk mengganti yourNamespace dengan nama namespace Relai yang Anda buat sebelumnya.

    string serviceNamespace = "yourNamespace";
    

    Bus Layanan menggunakan nama namespace Anda untuk membuat URI unik.

  2. Buat instans Uri untuk alamat dasar dari layanan yang berdasarkan pada namespace.

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

Untuk membuat dan mengonfigurasi host layanan web

Masih di Main(), buat host layanan web, menggunakan alamat URI yang dibuat sebelumnya di bagian ini.

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

Host layanan adalah objek WCF yang membuat instans aplikasi host. Contoh ini memberinya jenis host yang ingin Anda buat, yang merupakan ImageService, dan juga alamat di mana Anda ingin mengekspos aplikasi host.

Untuk menjalankan host layanan web

  1. Masih dalam Main(), tambahkan baris berikut untuk membuka layanan.

    host.Open();
    

    Layanan ini sekarang sedang berjalan.

  2. Menampilkan pesan yang menunjukkan bahwa layanan sedang berjalan, dan cara menghentikan layanan.

    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. Setelah selesai, tutup host layanan.

    host.Close();
    

Contoh kontrak dan implementasi layanan

Contoh berikut mencakup kontrak layanan dan implementasi dari langkah-langkah sebelumnya dalam tutorial dan meng-host layanan dalam aplikasi konsol. Kumpulkan kode berikut ke dalam file yang dapat dijalankan bernama 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();
        }
    }
}

Jalankan dan uji layanan

Setelah membangun solusi, lakukan hal berikut untuk menjalankan aplikasi:

  1. Pilih F5, atau telusuri ke lokasi file yang dapat dijalankan, ImageListener\bin\Debug\ImageListener.exe, untuk menjalankan layanan. Pastikan aplikasi tetap berjalan, karena diperlukan untuk langkah berikutnya.
  2. Salin dan tempel alamat dari perintah ke browser untuk melihat gambar.
  3. Setelah selesai, pilih Enter di jendela wantian perintah untuk menutup aplikasi.

Langkah berikutnya

Setelah Anda membuat aplikasi yang menggunakan layanan Azure Relay, lihat artikel berikut untuk mempelajari selengkapnya: