Mulai dengan Relay Hybrid Connections WebSockets di .NET
Dalam mulai cepat ini, Anda membuat aplikasi pengirim dan penerima Node.js yang mengirim dan menerima pesan menggunakan Hybrid Connections WebSockets di Azure Relay. Untuk mempelajari tentang Azure Relay secara umum, lihat Azure Relay.
Dalam mulai cepat ini, Anda melakukan langkah-langkah berikut:
- Buat namespace Relay dengan menggunakan portal Azure.
- Buat koneksi hibrida di namespace tersebut dengan menggunakan portal Azure.
- Tulis aplikasi konsol server (listener) untuk menerima pesan.
- Tulis aplikasi konsol klien (pengirim) untuk mengirim pesan.
- Jalankan aplikasi.
Prasyarat
Untuk menyelesaikan tutorial ini, Anda memerlukan prasyarat berikut:
- Visual Studio 2015 atau versi yang lebih baru. Contoh dalam tutorial ini menggunakan Visual Studio 2017.
- Langganan Azure. Jika Anda tidak memilikinya, buat akun gratis sebelum memulai.
Membuat namespace
Masuk ke portal Azure.
Pilih Semua layanan di menu sebelah kiri. Pilih Integrasi, cari Relay, gerakkan mouse di atas Relay, lalu pilih Buat.
Pada halaman Buat namespace layanan, ikuti langkah-langkah berikut:
Pilih langganan Azure untuk membuat namespace.
Untuk Grup sumber daya, pilih grup sumber daya yang ada tempat namespace akan aktif, atau buat grup baru.
Masukkan nama untuk namespace Relay.
Pilih wilayah tempat namespace layanan Anda harus dihosting.
Pilih Tinjau + buat di bagian bawah halaman.
Pada halaman Tinjau + buat, pilih Buat.
Setelah beberapa menit, Anda akan melihat halaman Relay untuk namespace.
Mendapatkan info masuk manajemen
Pada halaman Relay , pilih Kebijakan akses bersama di menu sebelah kiri. `
Pada halaman Kebijakan akses bersama, pilih RootManageSharedAccessKey.
Di bawah Kebijakan SAS: RootManageSharedAccessKey, pilih tombol Salin di sebelah String Koneksi Primer. Tindakan ini menyalin string koneksi ke clipboard untuk digunakan nanti. Tempelkan nilai ini ke Notepad atau beberapa lokasi sementara lainnya.
Ulangi langkah sebelumnya untuk menyalin dan menempelkan nilai Kunci primer ke lokasi sementara untuk digunakan nanti.
Buat koneksi hibrid
Pada halaman Relay untuk namespace Anda, ikuti langkah-langkah ini untuk membuat koneksi hibrid.
Di menu sebelah kiri, Di bawah Entitas, pilih Koneksi Hibrid, lalu pilih + Koneksi Hibrid.
Pada halaman Buat Koneksi Hibrid, masukkan nama untuk koneksi hibrid, dan pilih Buat.
Membuat aplikasi server (pendengar)
Di Visual Studio, tulis aplikasi konsol C# untuk mendengarkan dan menerima pesan dari relay.
Membuat aplikasi konsol lokal
Di Visual Studio, buat proyek Aplikasi Konsol (.NET Framework) baru.
Menambahkan paket Relay NuGet
- Klik kanan proyek yang baru dibuat, lalu pilih Kelola Paket NuGet.
- Pilih Telusuri, lalu cari Microsoft.Azure.Relay. Di hasil pencarian, pilih Microsoft Azure Relay.
- Pilih Instal untuk menyelesaikan penginstalan. Tutup kotak dialog.
Menulis kode untuk menerima pesan
Di bagian atas file Program.cs, ganti pernyataan
using
yang ada dengan pernyataanusing
berikut:using System; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Net; using Microsoft.Azure.Relay;
Tambahkan konstanta ke kelas
Program
untuk detail koneksi hibrid. Ganti tempat penampung dengan nilai yang Anda peroleh saat membuat koneksi hibrid. Pastikan untuk menggunakan nama namespace layanan yang sepenuhnya memenuhi syarat.// replace {RelayNamespace} with the name of your namespace private const string RelayNamespace = "YOUR-RELAY-NAMESPACE-NAME.servicebus.windows.net"; // replace {HybridConnectionName} with the name of your hybrid connection private const string ConnectionName = "HYBRID-CONNECTION-NAME"; // replace {SAKKeyName} with the name of your Shared Access Policies key, which is RootManageSharedAccessKey by default private const string KeyName = "SAS-KEY-NAME"; // replace {SASKey} with the primary key of the namespace you saved earlier private const string Key = "SAS-KEY-VALUE";
Tambahkan metode
ProcessMessagesOnConnection
ke kelasProgram
:// The method initiates the connection. private static async void ProcessMessagesOnConnection(HybridConnectionStream relayConnection, CancellationTokenSource cts) { Console.WriteLine("New session"); // The connection is a fully bidrectional stream. // Put a stream reader and a stream writer over it. // This allows you to read UTF-8 text that comes from // the sender, and to write text replies back. var reader = new StreamReader(relayConnection); var writer = new StreamWriter(relayConnection) { AutoFlush = true }; while (!cts.IsCancellationRequested) { try { // Read a line of input until a newline is encountered. var line = await reader.ReadLineAsync(); if (string.IsNullOrEmpty(line)) { // If there's no input data, signal that // you will no longer send data on this connection, // and then break out of the processing loop. await relayConnection.ShutdownAsync(cts.Token); break; } // Write the line on the console. Console.WriteLine(line); // Write the line back to the client, prepended with "Echo:" await writer.WriteLineAsync($"Echo: {line}"); } catch (IOException) { // Catch an I/O exception. This likely occurred when // the client disconnected. Console.WriteLine("Client closed connection"); break; } } Console.WriteLine("End session"); // Close the connection. await relayConnection.CloseAsync(cts.Token); }
Tambahkan metode
RunAsync
ke kelasProgram
:private static async Task RunAsync() { var cts = new CancellationTokenSource(); var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(KeyName, Key); var listener = new HybridConnectionListener(new Uri(string.Format("sb://{0}/{1}", RelayNamespace, ConnectionName)), tokenProvider); // Subscribe to the status events. listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; listener.Online += (o, e) => { Console.WriteLine("Online"); }; // Opening the listener establishes the control channel to // the Azure Relay service. The control channel is continuously // maintained, and is reestablished when connectivity is disrupted. await listener.OpenAsync(cts.Token); Console.WriteLine("Server listening"); // Provide callback for the cancellation token that will close the listener. cts.Token.Register(() => listener.CloseAsync(CancellationToken.None)); // Start a new thread that will continuously read the console. new Task(() => Console.In.ReadLineAsync().ContinueWith((s) => { cts.Cancel(); })).Start(); // Accept the next available, pending connection request. // Shutting down the listener allows a clean exit. // This method returns null. while (true) { var relayConnection = await listener.AcceptConnectionAsync(); if (relayConnection == null) { break; } ProcessMessagesOnConnection(relayConnection, cts); } // Close the listener after you exit the processing loop. await listener.CloseAsync(cts.Token); }
Tambahkan baris kode berikut ke metode
Main
dalam kelasProgram
:RunAsync().GetAwaiter().GetResult();
File Program.cs yang telah selesai akan terlihat seperti ini:
namespace Server { using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.Relay; public class Program { private const string RelayNamespace = "{RelayNamespace}.servicebus.windows.net"; private const string ConnectionName = "{HybridConnectionName}"; private const string KeyName = "{SASKeyName}"; private const string Key = "{SASKey}"; public static void Main(string[] args) { RunAsync().GetAwaiter().GetResult(); } private static async Task RunAsync() { var cts = new CancellationTokenSource(); var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(KeyName, Key); var listener = new HybridConnectionListener(new Uri(string.Format("sb://{0}/{1}", RelayNamespace, ConnectionName)), tokenProvider); // Subscribe to the status events. listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; listener.Online += (o, e) => { Console.WriteLine("Online"); }; // Opening the listener establishes the control channel to // the Azure Relay service. The control channel is continuously // maintained, and is reestablished when connectivity is disrupted. await listener.OpenAsync(cts.Token); Console.WriteLine("Server listening"); // Provide callback for a cancellation token that will close the listener. cts.Token.Register(() => listener.CloseAsync(CancellationToken.None)); // Start a new thread that will continuously read the console. new Task(() => Console.In.ReadLineAsync().ContinueWith((s) => { cts.Cancel(); })).Start(); // Accept the next available, pending connection request. // Shutting down the listener allows a clean exit. // This method returns null. while (true) { var relayConnection = await listener.AcceptConnectionAsync(); if (relayConnection == null) { break; } ProcessMessagesOnConnection(relayConnection, cts); } // Close the listener after you exit the processing loop. await listener.CloseAsync(cts.Token); } private static async void ProcessMessagesOnConnection(HybridConnectionStream relayConnection, CancellationTokenSource cts) { Console.WriteLine("New session"); // The connection is a fully bidrectional stream. // Put a stream reader and a stream writer over it. // This allows you to read UTF-8 text that comes from // the sender, and to write text replies back. var reader = new StreamReader(relayConnection); var writer = new StreamWriter(relayConnection) { AutoFlush = true }; while (!cts.IsCancellationRequested) { try { // Read a line of input until a newline is encountered. var line = await reader.ReadLineAsync(); if (string.IsNullOrEmpty(line)) { // If there's no input data, signal that // you will no longer send data on this connection. // Then, break out of the processing loop. await relayConnection.ShutdownAsync(cts.Token); break; } // Write the line on the console. Console.WriteLine(line); // Write the line back to the client, prepended with "Echo:" await writer.WriteLineAsync($"Echo: {line}"); } catch (IOException) { // Catch an I/O exception. This likely occurred when // the client disconnected. Console.WriteLine("Client closed connection"); break; } } Console.WriteLine("End session"); // Close the connection. await relayConnection.CloseAsync(cts.Token); } } }
Membuat aplikasi klien (pengirim)
Untuk mengirim pesan ke antrean, tulis aplikasi konsol C# menggunakan Visual Studio.
Membuat aplikasi konsol lokal
Di Visual Studio, buat proyek Aplikasi Konsol (.NET Framework) baru.
Menambahkan paket Relay NuGet
- Klik kanan proyek yang baru dibuat, lalu pilih Kelola Paket NuGet.
- Pilih Telusuri, lalu cari Microsoft.Azure.Relay. Di hasil pencarian, pilih Microsoft Azure Relay.
- Pilih Instal untuk menyelesaikan penginstalan. Tutup kotak dialog.
Menulis kode untuk mengirim pesan
Di bagian atas file Program.cs, ganti pernyataan
using
yang ada dengan pernyataanusing
berikut:using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.Relay;
Tambahkan konstanta ke kelas
Program
untuk detail koneksi hibrid. Ganti tempat penampung dengan nilai yang Anda peroleh saat membuat koneksi hibrid. Pastikan untuk menggunakan nama namespace layanan yang sepenuhnya memenuhi syarat.// replace {RelayNamespace} with the name of your namespace private const string RelayNamespace = "YOUR-RELAY-NAMESPACE-NAME.servicebus.windows.net"; // replace {HybridConnectionName} with the name of your hybrid connection private const string ConnectionName = "HYBRID-CONNECTION-NAME"; // replace {SAKKeyName} with the name of your Shared Access Policies key, which is RootManageSharedAccessKey by default private const string KeyName = "SAS-KEY-NAME"; // replace {SASKey} with the primary key of the namespace you saved earlier private const string Key = "SAS-KEY-VALUE";
Tambahkan metode berikut ke kelas
Program
:private static async Task RunAsync() { Console.WriteLine("Enter lines of text to send to the server with ENTER"); // Create a new hybrid connection client. var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(KeyName, Key); var client = new HybridConnectionClient(new Uri(String.Format("sb://{0}/{1}", RelayNamespace, ConnectionName)), tokenProvider); // Initiate the connection. var relayConnection = await client.CreateConnectionAsync(); // Run two concurrent loops on the connection. One // reads input from the console and writes it to the connection // with a stream writer. The other reads lines of input from the // connection with a stream reader and writes them to the console. // Entering a blank line shuts down the write task after // sending it to the server. The server then cleanly shuts down // the connection, which terminates the read task. var reads = Task.Run(async () => { // Initialize the stream reader over the connection. var reader = new StreamReader(relayConnection); var writer = Console.Out; do { // Read a full line of UTF-8 text up to newline. string line = await reader.ReadLineAsync(); // If the string is empty or null, you are done. if (String.IsNullOrEmpty(line)) break; // Write to the console. await writer.WriteLineAsync(line); } while (true); }); // Read from the console and write to the hybrid connection. var writes = Task.Run(async () => { var reader = Console.In; var writer = new StreamWriter(relayConnection) { AutoFlush = true }; do { // Read a line from the console. string line = await reader.ReadLineAsync(); // Write the line out, also when it's empty. await writer.WriteLineAsync(line); // Quit when the line is empty, if (String.IsNullOrEmpty(line)) break; } while (true); }); // Wait for both tasks to finish. await Task.WhenAll(reads, writes); await relayConnection.CloseAsync(CancellationToken.None); }
Tambahkan baris kode berikut ke metode
Main
dalam kelasProgram
.RunAsync().GetAwaiter().GetResult();
Seperti inilah harusnya tampilan Program.cs:
using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.Relay; namespace Client { class Program { private const string RelayNamespace = "{RelayNamespace}.servicebus.windows.net"; private const string ConnectionName = "{HybridConnectionName}"; private const string KeyName = "{SASKeyName}"; private const string Key = "{SASKey}"; static void Main(string[] args) { RunAsync().GetAwaiter().GetResult(); } private static async Task RunAsync() { Console.WriteLine("Enter lines of text to send to the server with ENTER"); // Create a new hybrid connection client. var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(KeyName, Key); var client = new HybridConnectionClient(new Uri(String.Format("sb://{0}/{1}", RelayNamespace, ConnectionName)), tokenProvider); // Initiate the connection. var relayConnection = await client.CreateConnectionAsync(); // Run two concurrent loops on the connection. One // reads input from the console and then writes it to the connection // with a stream writer. The other reads lines of input from the // connection with a stream reader and then writes them to the console. // Entering a blank line shuts down the write task after // sending it to the server. The server then cleanly shuts down // the connection, which terminates the read task. var reads = Task.Run(async () => { // Initialize the stream reader over the connection. var reader = new StreamReader(relayConnection); var writer = Console.Out; do { // Read a full line of UTF-8 text up to newline. string line = await reader.ReadLineAsync(); // If the string is empty or null, you are done. if (String.IsNullOrEmpty(line)) break; // Write to the console. await writer.WriteLineAsync(line); } while (true); }); // Read from the console and write to the hybrid connection. var writes = Task.Run(async () => { var reader = Console.In; var writer = new StreamWriter(relayConnection) { AutoFlush = true }; do { // Read a line from the console. string line = await reader.ReadLineAsync(); // Write the line out, also when it's empty. await writer.WriteLineAsync(line); // Quit when the line is empty. if (String.IsNullOrEmpty(line)) break; } while (true); }); // Wait for both tasks to finish. await Task.WhenAll(reads, writes); await relayConnection.CloseAsync(CancellationToken.None); } } }
Catatan
Kode sampel dalam artikel ini menggunakan string koneksi untuk mengautentikasi ke namespace Azure Relay agar tutorial tetap sederhana. Kami menyarankan agar Anda menggunakan autentikasi ID Microsoft Entra di lingkungan produksi, daripada menggunakan string koneksi atau tanda tangan akses bersama, yang dapat lebih mudah disusupi. Untuk informasi terperinci dan kode sampel untuk menggunakan autentikasi ID Microsoft Entra, lihat Mengautentikasi dan mengotorisasi aplikasi dengan ID Microsoft Entra untuk mengakses entitas Azure Relay dan Mengautentikasi identitas terkelola dengan ID Microsoft Entra untuk mengakses sumber daya Azure Relay.
Menjalankan aplikasi
Jalankan aplikasi server.
Jalankan aplikasi klien dan masukkan beberapa teks.
Pastikan konsol aplikasi server mengeluarkan teks yang dimasukkan dalam aplikasi klien.
Selamat, Anda telah membuat aplikasi Hybrid Connections lengkap!
Langkah berikutnya
Dalam mulai cepat ini, Anda membuat aplikasi klien dan server Node.js yang menggunakan HTTP untuk mengirimkan dan menerima pesan. Fitur Koneksi Hibrida Azure Relay juga mendukung penggunaan WebSocket untuk mengirim dan menerima pesan. Untuk mempelajari cara menggunakan HTTP dengan Azure Relay Hybrid Connections, lihat mulai cepat HTTP Node.js.
Dalam mulai cepat ini, Anda menggunakan .NET Framework untuk membuat aplikasi klien dan server. Untuk mempelajari cara menulis aplikasi klien dan server menggunakan Node.js, lihat panduan mulai cepat Node.js WebSockets atau panduan cepat HTTP Node.js.