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:
- Menginstal prasyarat untuk tutorial ini.
- 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:
- Langganan Azure. Jika Anda tidak memilikinya, buat akun gratis sebelum memulai.
- Visual Studio 2015 atau versi yang lebih baru. Contoh dalam tutorial ini menggunakan Visual Studio 2019.
- Azure SDK untuk .NET. Instal dari halaman unduhan SDK.
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
Mulai Microsoft Visual Studio sebagai administrator. Untuk melakukannya, klik kanan ikon program Visual Studio, lalu pilih Jalankan sebagai administrator.
Di Visual Studio, pilih Buat proyek baru.
Di Buat proyek baru, pilih Aplikasi Konsol (.NET Framework) untuk C#, lalu pilih Berikutnya.
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.Pada Penjelajah Solusi, klik kanan proyek ImageListener dan pilih Kelola Paket NuGet.
Pilih Telusuri, lalu cari dan pilih WindowsAzure.ServiceBus. Klik Instal, lalu 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
.Secara eksplisit menambahkan referensi
System.ServiceModel.Web.dll
ke proyek. Di Penjelajah Solusi,klik kanan Referensi di bawah folder proyek, dan pilih Tambahkan Referensi.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:
Tambahkan pernyataan
using
berikut ke 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.
Ganti nama namespace
ImageListener
menjadiMicrosoft.ServiceBus.Samples
.namespace Microsoft.ServiceBus.Samples { ...
Setelah membuka tanda kurung kurawal dari deklarasi namespace, tentukan antarmuka baru bernama
IImageContract
dan terapkan atributServiceContractAttribute
ke antarmuka dengan nilaihttps://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.
Dalam antarmuka
IImageContract
, nyatakan metode untuk operasi tunggal yang diekspos kontrakIImageContract
di antarmuka dan terapkan atributOperationContract
ke metode yang ingin Anda ekspos sebagai bagian dari kontrak Bus Layanan publik.public interface IImageContract { [OperationContract] Stream GetImage(); }
Di atribut
OperationContract
, tambahkan nilaiWebGet
.public interface IImageContract { [OperationContract, WebGet] Stream GetImage(); }
Menambahkan nilai
WebGet
memungkinkan layanan relai untuk merutekan permintaan HTTP GET keGetImage
, dan untuk menerjemahkan nilai pengembalianGetImage
menjadi balasanHTTP GETRESPONSE
. Kemudian dalam tutorial, Anda akan menggunakan browser web untuk mengakses metode ini, dan untuk menampilkan gambar di browser.Setelah definisi
IImageContract
, nyatakan saluran yang mewarisi dari antarmukaIImageContract
danIClientChannel
.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 pengembalianGetImage
dan menerjemahkannya menjadiHTTP GETRESPONSE
untuk browser klien.Pilih Build>Solusi Build untuk mengonfirmasi keakuratan pekerjaan Anda sejauh ini.
Contoh yang mendefinisikan kontrak Relai WCF
Kode berikut menunjukkan antarmuka dasar yang menentukan kontrak 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)
{
}
}
}
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
Buat kelas baru bernama
ImageService
setelah definisi antarmukaIImageContract
. KelasImageService
menerapkan antarmukaIImageContract
.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()
.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.
Tambahkan gambar .jpg ke proyek Anda. File ini adalah gambar yang ditampilkan layanan di browser penerima.
- Klik kanan proyek Anda, dan pilih Tambahkan.
- Lalu pilih Item yang Ada.
- 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.
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.
Gunakan prosedur dalam Untuk membuat kontrak dengan antarmuka untuk menambahkan referensi ke perakitan System.Drawing.dllke proyek.
Tambahkan pernyataan terkait
using
berikut:using System.Drawing; using System.Drawing.Imaging; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Web;
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); } }
Setelah kode sebelumnya, tambahkan metode
GetImage
berikut di kelasImageService
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.Pilih Build>Solusi Build.
Untuk menentukan konfigurasi guna menjalankan layanan web di Microsoft Azure Service Bus
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 dihosting untuk berkomunikasi satu sama lain. Pengikatan data adalah jenis protokol yang digunakan untuk berkomunikasi. Perbedaan utamanya adalah bahwa titik akhir layanan yang dikonfigurasi mengacu pada pengikatan WebHttpRelayBinding .
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 keNone
. Pengaturan ini menunjukkan bahwa titik akhir menggunakan pengikatan ini tidak memerlukan info masuk klien.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 defaultsbTokenProvider
, yang didefinisikan di langkah berikutnya.Setelah elemen
<services>
, buat elemen<behaviors>
dengan konten berikut, menggantiSAS_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>
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>
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
Dalam deklarasi fungsi
Main()
, buat variabel untuk menyimpan namespace proyek Anda. Pastikan untuk menggantiyourNamespace
dengan nama namespace Relai yang Anda buat sebelumnya.string serviceNamespace = "yourNamespace";
Bus Layanan menggunakan nama namespace Anda untuk membuat URI unik.
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
Masih dalam
Main()
, tambahkan baris berikut untuk membuka layanan.host.Open();
Layanan ini sekarang sedang berjalan.
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();
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:
- 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.
- Salin dan tempel alamat dari perintah ke browser untuk melihat gambar.
- Setelah selesai, pilih Enter di jendela wantian perintah untuk menutup aplikasi.
Konten terkait
Setelah Anda membuat aplikasi yang menggunakan layanan Azure Relay, lihat artikel berikut untuk mempelajari selengkapnya: