مراكز SignalR والاتصالات
أنشئوا مركز SignalR، واربطوه في ASP.NET Core، وأنشئوا اتصالات WebSocket من عملاء JavaScript و.NET.
مراكز SignalR والاتصالات درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما هو SignalR؟
SignalR هي مكتبة لـ ASP.NET Core تضيف اتصالًا فوريًا وثنائي الاتجاه بين الخادم والعملاء. وتختار تلقائيًا أفضل وسيلة نقل — WebSockets أو Server-Sent Events أو Long Polling — بناءً على ما يدعمه الطرفان.
إعداد SignalR
أضف SignalR إلى الخدمات واربط نقطة نهاية hub. الـ hub هو فئة تتولى معالجة اتصالات العملاء واستدعاءات الطرق.
builder.Services.AddSignalR();
var app = builder.Build();
app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");
app.Run();إنشاء Hub
ورّث من Hub. يستدعي العملاء طرق Hub. وتوفر الخاصية Context معلومات الاتصال، بينما تتيح لك Clients إرسال الرسائل مجددًا.
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();
}
}عميل JavaScript
ينشئ عميل SignalR الرسمي لـ JavaScript اتصالًا، ويسجّل معالجات الأحداث، ويبدأ الاتصال. ويمكن استدعاء الطرق المعرّفة في Hub من 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!");عميل SignalR لـ .NET
يعمل عميل .NET بالطريقة نفسها، وهو مفيد للاتصالات الفورية بين الخدمات أو لتطبيقات سطح المكتب والأجهزة المحمولة.
// 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!");الإرسال إلى عملاء محددين
تحتوي الخاصية Clients على طرق لاستهداف اتصالات محددة أو مستدعي الطريقة أو جميع العملاء المتصلين باستثناء عملاء محددين.
// 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);سياق Hub: الإرسال من خارج Hub
احقن IHubContext<T> في الخدمات أو العاملين في الخلفية لإرسال الرسائل من خارج فئة Hub، وهو أمر أساسي لعمليات الدفع التي يبدأها الخادم.
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);
}
}أحداث دورة حياة الاتصال
تجاوز OnConnectedAsync وOnDisconnectedAsync لتتبّع الاتصالات أو الحفاظ على الحالة أو تنظيف الموارد.
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;إعادة الاتصال التلقائي
فعّل إعادة الاتصال التلقائي لدى العميل للتعامل بسلاسة مع انقطاعات الاتصال المؤقتة. ويمكنك تخصيص فترات التأخير بين محاولات إعادة الاتصال.
// 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));المصادقة باستخدام SignalR
تحترم SignalR البرمجيات الوسيطة للمصادقة في ASP.NET Core. أضف [Authorize] إلى فئة Hub أو استخدم معالج JWT الذي يدعم الرموز المميزة في سلسلة الاستعلام، وهو مطلوب لمصادقة 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;
}
};
});تحقّق سريعًا
كيف ترسل رسالة SignalR من خدمة تعمل في الخلفية، أي من خارج فئة Hub؟
مراجعة: Hubs واتصالات SignalR
أهم النقاط:
- تختار SignalR أفضل وسيلة نقل تلقائيًا، مثل WebSockets وSSE وLong Polling
- يمكن للعملاء استدعاء طرق Hub؛ وتستهدف
Clients.*المستلمين المحددين - احقن
IHubContext<T>لدفع الرسائل من خارج Hub - تجاوز
OnConnectedAsync/OnDisconnectedAsyncلإدارة دورة الحياة - استخدم
withAutomaticReconnect()لاتصالات العملاء المرنة - تُعد مصادقة JWT عبر سلسلة الاستعلام مطلوبة لاتصالات WebSocket
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «مراكز SignalR والاتصالات» مجاني؟
نعم — نص درس «مراكز SignalR والاتصالات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «مراكز SignalR والاتصالات»؟
أنشئوا مركز SignalR، واربطوه في ASP.NET Core، وأنشئوا اتصالات WebSocket من عملاء JavaScript و.NET. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مراكز SignalR والاتصالات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراكز SignalR والاتصالات
- المجموعات والمستخدمون وإدارة الاتصالات
- المراكز محدّدة الأنواع
- التوسّع باستخدام Redis Backplane