Hub & Koneksi SignalR
Buat hub SignalR, petakan di ASP.NET Core, dan bangun koneksi WebSocket dari klien JavaScript serta .NET.
Hub & Koneksi SignalR adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Apa Itu SignalR?
SignalR adalah pustaka ASP.NET Core yang menambahkan komunikasi dua arah waktu nyata antara server dan klien. SignalR secara otomatis memilih transportasi terbaik — WebSockets, Server-Sent Events, atau polling panjang — berdasarkan dukungan kedua sisi.
Menyiapkan SignalR
Tambahkan SignalR ke layanan dan petakan endpoint hub. Hub adalah kelas yang menangani koneksi klien dan pemanggilan metode.
builder.Services.AddSignalR();
var app = builder.Build();
app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");
app.Run();Membuat Hub
Turunkan kelas dari Hub. Metode hub dipanggil oleh klien. Properti Context menyediakan informasi koneksi, sedangkan Clients memungkinkan Anda mengirim pesan kembali.
using Microsoft.AspNetCore.SignalR;
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
// Broadcast to ALL connected clients
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
public override async Task OnConnectedAsync()
{
await Clients.Caller.SendAsync("Welcome",
$"Connected as {Context.ConnectionId}");
await base.OnConnectedAsync();
}
}Klien JavaScript
Klien JavaScript resmi SignalR membangun koneksi, mendaftarkan handler peristiwa, dan memulai koneksi. Metode yang ditentukan pada hub dapat dipanggil dari JavaScript.
// npm install @microsoft/signalr
import * as signalR from "@microsoft/signalr";
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hubs/chat")
.withAutomaticReconnect()
.build();
connection.on("ReceiveMessage", (user, message) => {
console.log(`${user}: ${message}`);
});
await connection.start();
await connection.invoke("SendMessage", "Alice", "Hello!");Klien SignalR .NET
Klien .NET bekerja dengan cara yang sama — berguna untuk komunikasi waktu nyata antarlayanan atau aplikasi desktop dan seluler.
// dotnet add package Microsoft.AspNetCore.SignalR.Client
var connection = new HubConnectionBuilder()
.WithUrl("https://myapp.com/hubs/chat")
.WithAutomaticReconnect()
.Build();
connection.On<string, string>("ReceiveMessage", (user, msg) =>
Console.WriteLine($"{user}: {msg}"));
await connection.StartAsync();
await connection.InvokeAsync("SendMessage", "Bot", "Connected!");Mengirim ke Klien Tertentu
Properti Clients memiliki metode untuk menargetkan koneksi tertentu, pemanggil, atau semua klien yang terhubung kecuali yang ditentukan.
// To the caller only
await Clients.Caller.SendAsync("YouSaid", message);
// To a specific connection
await Clients.Client(connectionId).SendAsync("PrivateMsg", msg);
// To all except caller
await Clients.Others.SendAsync("ReceiveMessage", user, message);
// To multiple specific connections
await Clients.Clients(new[] { id1, id2 })
.SendAsync("DirectMsg", msg);Konteks Hub: Mengirim dari Luar Hub
Suntikkan IHubContext<T> ke dalam layanan atau pekerja latar belakang untuk mengirim pesan dari luar kelas hub — hal yang penting untuk pengiriman yang diprakarsai server.
public class NotificationService
{
private readonly IHubContext<ChatHub> _hub;
public NotificationService(IHubContext<ChatHub> hub) => _hub = hub;
public async Task BroadcastAlertAsync(string alert)
{
// Send to all clients from a background service
await _hub.Clients.All.SendAsync("SystemAlert", alert);
}
}Peristiwa Siklus Hidup Koneksi
Ganti OnConnectedAsync dan OnDisconnectedAsync untuk melacak koneksi, mempertahankan status, atau membersihkan sumber daya.
public override async Task OnConnectedAsync()
{
_connections.TryAdd(Context.ConnectionId, GetUserName());
await Clients.All.SendAsync("UserJoined", GetUserName());
await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception? ex)
{
_connections.TryRemove(Context.ConnectionId, out var user);
await Clients.All.SendAsync("UserLeft", user);
await base.OnDisconnectedAsync(ex);
}
private string GetUserName() =>
Context.User?.Identity?.Name ?? Context.ConnectionId;Penyambungan Kembali Otomatis
Aktifkan penyambungan kembali otomatis pada klien untuk menangani koneksi terputus sementara dengan baik. Anda dapat menyesuaikan jeda percobaan ulang.
// JavaScript client
const conn = new signalR.HubConnectionBuilder()
.withUrl("/hubs/chat")
.withAutomaticReconnect([0, 2000, 5000, 10000, 30000]) // retry delays in ms
.build();
conn.onreconnecting(err => console.warn("Reconnecting...", err));
conn.onreconnected(id => console.log("Reconnected:", id));
conn.onclose(err => console.error("Disconnected:", err));Autentikasi dengan SignalR
SignalR mematuhi perangkat tengah autentikasi ASP.NET Core. Tambahkan [Authorize] ke kelas hub atau gunakan penangan JWT yang mendukung token dalam string kueri (diperlukan untuk autentikasi WebSocket).
[Authorize]
public class PrivateHub : Hub
{
public Task SendMessage(string msg)
{
var user = Context.User!.Identity!.Name;
return Clients.All.SendAsync("Msg", user, msg);
}
}
// JWT via query string (WebSocket requirement):
builder.Services.AddAuthentication().AddJwtBearer(opt =>
{
opt.Events = new JwtBearerEvents
{
OnMessageReceived = ctx =>
{
var token = ctx.Request.Query["access_token"];
if (!string.IsNullOrEmpty(token))
ctx.Token = token;
return Task.CompletedTask;
}
};
});Pemeriksaan Singkat
Bagaimana cara mengirim pesan SignalR dari layanan latar belakang (di luar kelas hub)?
Ringkasan: Hub dan Koneksi SignalR
Poin penting:
- SignalR otomatis memilih transportasi terbaik (WebSockets, SSE, polling panjang)
- Metode hub dapat dipanggil oleh klien;
Clients.*menargetkan penerima tertentu - Suntikkan
IHubContext<T>untuk mengirim pesan dari luar hub - Ganti
OnConnectedAsync/OnDisconnectedAsyncuntuk mengelola siklus hidup - Gunakan
withAutomaticReconnect()untuk koneksi klien yang tangguh - Autentikasi JWT melalui string kueri diperlukan untuk koneksi WebSocket
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Hub & Koneksi SignalR” gratis?
Ya — teks lengkap “Hub & Koneksi SignalR” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Hub & Koneksi SignalR”?
Buat hub SignalR, petakan di ASP.NET Core, dan bangun koneksi WebSocket dari klien JavaScript serta .NET. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Hub & Koneksi SignalR” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Hub & Koneksi SignalR
- Grup, Pengguna & Pengelolaan Koneksi
- Hub Bertipe Kuat
- Penskalaan dengan Redis Backplane