Table of Contents
הצורך בנתונים בזמן אמת ביישומים מודרניים של MVC
משתמשים מודרניים מצפים שאפליקציות אינטרנט ירגישו בחיים ותגובה. דפי סטטיקה הדורשים רעננות ידנית או סקרים עבור כל עדכון במהירות מרגיש מיושן.עדכוני נתונים בזמן אמת הפכו לביקוש מרכזי לתכונות כגון חי, הודעות מיידיות, עריכת שיתופית, ו ניטור בזמן אמת.מודל המסורתי של בקשות אינטרנט אינו מספיק עבור תרחישים אלה, כי זה כוחות הלקוח לבקש כל הזמן את השרת לשינויים, היה הגדלת רוחב הפס.
ASP.NET MVC מספקת בסיס מוצק לבניית יישומי אינטרנט מתוחכמים בשרת, אך לא תוכנן עבור תקשורת דחיפה ממוקדת השרת-לטווח.כדי לגשר על הפער הזה, מיקרוסופט הציגה את Microsoft:0SignalRearalRLT 1:1, ספרייה המאפשרת תקשורת דו-זמנית בזמן אמת בין השרת לבין הלקוחות.
מאמר זה מספק מדריך מקיף ליישום עדכוני נתונים בזמן אמת ביישומים MVC באמצעות SignalR. תלמד את האדריכלות מאחורי SignalR, הוראות שלב-שלב, תכונות מתקדמות כגון קבוצות ואימות, שיטות הטובות ביותר לביצועים, ואת השימוש בעולם האמיתי מקרים.עד הסוף, אתה תהיה מצויד להוסיף תכונות חיים, דינמיות ליישומים MVC שלך עם ביטחון.
אדריכלות: SignalR Architecture
מודל ה-Hub
סיגנל משתמש ב-(FLT:0)HubFLT:1 אבסטרציה לניהול תקשורת בין השרת לבין לקוחות מחוברים.A Hub הוא מחלקה אשר יורשה מהמחלקה הבסיסית:0.1.זה מגדיר שיטות שלקוחות יכולים להתקשר מרחוק ומספקים API בעל אופי חזק כדי להפעיל שיטות על כל הלקוחות המחוברים, קבוצות ספציפיות, או לקוחות בודדים.
מכונאים ונפילתם
(הופנה מהדף ויקרא י"ד) , [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]] [[[[1924]]]]
המשא ומתן על התחבורה מתרחש במהלך חיבור ראשוני לחיצת היד.הלקוח שולח בקשה למשא ומתן, השרת מגיב עם רשימת התחבורה הנתמכת.הלקוח מנסה להתחבר באמצעות התחבורה הטובה ביותר תחילה.תהליך זה שקוף קוד היישום שלך, אבל ההבנה שהוא עוזר כאשר debuing בעיות קישוריות או אופטימיזציה לסביבות WebSocket-רק.
מעגל החיים
כל לקוח הקשור לרכזת אותר מיוצג על ידי מזהה חיבור ייחודי.כאשר לקוח מתחבר, השרת יכול לקרוא לשיטת ה-FLT:1 במרכז כדי לבצע כל היערכות. בדומה, FLT:2 ו-FLT:3 שיטות לאפשר לך להתמודד עם ניתוקויות מחדש של לקוחות איתותר באופן אוטומטי, אשר ניתן להגדיר כדי לנסות להגדיל את הגמישות גם כאשר יש צורך בחוויות קריטיות.
הגדרת אות ב ASP.NET MVC Application
התקנת החבילות הדרושות
הצעד הראשון הוא להוסיף את חבילת ה-SelR Nu Get לפרויקט MVC שלך.You יכול לעשות זאת באמצעות קונסולת מנהל החבילה או מנהל החבילה NuGet UI עבור MVC 5 יישומים, להשתמש ב- MLT:4 החבילה כוללת גם רכיבים של שרת וספריית JavaScript בצד הלקוחות.אם אתה מתכנן להשתמש מסגרת JavaScript או לקוח שאינו Microsoft, תוכל להתקין את הלקוח JavaScript בנפרד: 5.
לאחר ההתקנה, ודא כי הקבצים הבאים נמצאים בפרויקט שלך:
- (ב) LT:6 – ספריית הלקוח
- (ב) [15] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
תגית: SignalR in OWIN Startup
ASP.NET MVC 5 משתמש ב-OWIN עבור תוכנת זיהוי.Des.R צריך להיות מוגדר בכיתה הסטארט-אפ של OWIN.אם הפרויקט שלך כבר לא יש קובץ 8.
using Microsoft.Owin;
using Owin;
using YourNamespace; // Replace with your project's namespace
[assembly: OwinStartup(typeof(Startup))]
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any other OWIN middleware configuration can go here.
app.MapSignalR();
}
}
ה-FLT:10 קורא לרישום של אות ומפות את מסלול ברירת המחדל ל-FLT:11.You יכול להתאים את המסלול על ידי העברת אובייקט 12:12 אבל עבור רוב היישומים ברירת המחדל הוא מספיק.
ניהול פרויקטים של Pre-OWIN (Legacy)
אם אתה משתמש בפרויקט MVC מבוגר יותר שאינו תומך ב-OWIN, באפשרותך להגדיר את אותר בשיטה של 13:13 על ידי קריאה ל-FLT.
יצירת רכז וחיבור עם לקוחות
Server-Side Hub Class
Define a Hub על ידי יצירת מחלקה אשר יורשת מ-FLT:16 בתוך הכיתה הזאת, אתה יכול להגדיר שיטות כי לקוחות יכולים להשתמש. שיטות אלה יכולים לקבל פרמטרים, לבצע לוגיקה בצד השרת ולאחר מכן להתקשר בחזרה ללקוחות באמצעות הנכס LT:17.
using Microsoft.AspNet.SignalR;
using System.Threading.Tasks;
public class LiveDataHub : Hub
{
public async Task SendNotification(string userId, string message)
{
// Optionally perform server-side validation or storage
await Clients.User(userId).receiveNotification(message);
}
public override Task OnConnected()
{
// You can associate the connection with a user/group here
return base.OnConnected();
}
}
בדוגמה זו, יש מרכז שיטה אחת של מיפוי משתמשים, אשר שולח הודעה למשתמש ספציפי.השיטה:20 משתמשת במיפוי המשתמש שנבנה על ידי SignalR, הדורש אימות להיות מוגדר (התעלם מאוחר יותר) ניתן גם להשתמש ב-FLT:21 כדי לשדר לכל הלקוחות המחוברים, או FLT:22 כדי לשלוח קבוצה מסוימת.
אינטגרציה של Customer-Side JavaScript
בצד הלקוח, כולל ספריית SignalR JavaScript ותסריט הפרוקסי המתגנת אוטומטית ב-FLT:23 .התסריט הפרוקסי נוצר דינמי על ידי השרת ומספק גישה קלה מאוד לשיטות הרכזות שלך.כאן הוא מערכת טיפוסית של לקוחות:
<script src="~/Scripts/jquery.signalR-2.4.2.min.js"></script>
<script src="~/signalr/hubs"></script>
<script>
$(function () {
// Reference the auto-generated proxy for the hub
var liveDataHub = $.connection.liveDataHub;
// Define a client-side method that the hub can call
liveDataHub.client.receiveNotification = function (message) {
$('#notifications').append('<p>' + message + '</p>');
};
// Start the connection
$.connection.hub.start().done(function () {
console.log('Connected to SignalR hub.');
// Optionally call a server method after connection is established
// liveDataHub.server.sendNotification('user1', 'Hello from client!');
}).fail(function (error) {
console.error('SignalR connection failed: ' + error);
});
});
</script>
שיטת ה-FLT:25 יזום את החיבור עם התחבורה הטובה ביותר זמין.TheFLT:26 שריפות קריאות לאחר חיבור מוצלח, ואתה יכול להתחיל לקרוא שיטות שרת או האזנה עבור שיטות הלקוח ייעוד.תמיד להתמודד עם כישלונות בחסד, במיוחד ביישומים ייצור.
Calling Server Methods from Customer
כדי להשתמש בשיטת שרת מהלקוח, השתמש באובייקט 27.
$('#sendButton').click(function () {
liveDataHub.server.sendNotification($('#userId').val(), $('#messageInput').val());
});
SignalR מארגן את הפרמטרים באופן אוטומטי באמצעות JSON.שיטת השרת פועלת על מאגר חוט השרת, וכל יוצאים מן הכלל מוחזרים בחזרה ללקוח.
מידע על Server-Side Code
משימות פיקוח ורקע
מרכזי אותות משמשים בדרך כלל מפעולות בקר, שירותי רקע, או רכיבים אחרים של השרת בצד השרת.כדי לשלוח עדכונים בזמן אמת מתוך שיטת רכזות, אתה צריך לקבל התייחסות להקשר המרכז.
public class DataController : Controller
{
public ActionResult Refresh()
{
// Simulate a data update
string newData = GetLatestData();
// Get the hub context and broadcast to all connected clients
var hubContext = GlobalHost.ConnectionManager.GetHubContext<LiveDataHub>();
hubContext.Clients.All.receiveUpdate(newData);
return Json(new { success = true });
}
}
גישה זו עובדת היטב עבור תרחישים פשוטים.עם זאת, עבור משימות רקע ארוכות (למשל, תורי עיבוד, ניטור שירותים חיצוניים), לשקול שימוש בשירות ייעודי המחזיק התייחסות להקשר המרכז.אתה חייב להיות זהיר לגבי בטיחות חוט ולהימנע חסימת צינור אותות.
שימוש בשירותים רקע עם SignalR
ביישומים מודרניים ASP.NET MVC, אתה יכול לשלב את אותר עם EF:0BackgroundmentalFLT 1 או FLT:2 Hosted ServicesFLT 3 (אם באמצעות ASP.NET Core; עבור MVC 5, אתה יכול להשתמש ב-FLT:32 באמצעות אחסון או חוט רקע פשוט).
תכונות מתקדמות SignalR
שימוש ב- Groups for Selective Broadcasting
לעתים קרובות עליך לשלוח עדכונים למצע של משתמשים ולא לכל אחד.ה- SignalR תומך ב-FLT:0groupsFLT:1 שניתן לנהל בשרת.לקוחות יכולים להצטרף או לעזוב קבוצות על ידי קריאה שיטות במרכז:
public class ChatHub : Hub
{
public async Task JoinRoom(string roomName)
{
await Groups.Add(Context.ConnectionId, roomName);
}
public async Task LeaveRoom(string roomName)
{
await Groups.Remove(Context.ConnectionId, roomName);
}
public void SendToRoom(string roomName, string message)
{
Clients.Group(roomName).receiveMessage(message);
}
}
קבוצות הן אידיאליות ליישום תכונות כמו חדרי צ'אט, משחקי מקוון lobbies, או לוחות מחוונים ספציפיים של המחלקה. Note כי חברות הקבוצה קשורה לחיבור, לא למשתמש.אם למשתמש יש מספר רב של כרטיסיות פתוחות, כל חיבור חייב להצטרף באופן עצמאי לקבוצה.
User-Specific Messaging with Authentication
אותות משולבים באופן טבעי עם זהות ASP.NET.כאשר משתמש הוא אותנטי, ההקשר המרכזי חושף את ה-FLT:34 ואת זהותו של המשתמש קשורה באופן אוטומטי לחיבור.
לשלוח הודעה למשתמש האותנטיות הנוכחי משיטת רכז:
public class PrivateMessagingHub : Hub
{
public void SendPrivateMessage(string toUser, string message)
{
string fromUser = Context.User.Identity.Name;
Clients.User(toUser).receivePrivateMessage(fromUser, message);
}
}
Authentication הוא חיוני עבור תכונות בזמן אמת רבות, כגון הודעות מותאמות אישית או זרמי נתונים ספציפיים למשתמש.לוודא שאתה מגדיר אימות (cookies, אסימונים) לפני שקשר אותות הוקם.
לצאת עם מטוס אחורי
כאשר היישום שלך פועל על שרתים מרובים (חוות אינטרנט), אתה צריך FLT:0 (backplaneofph:1) כדי לסנכרן הודעות על פני שרתים. SignalR תומך מספר ספקי אחוריים: Redis, SQL Server, Azure Service Bus, ויישומים מותאמים אישית.המטוס פועל על ידי פרסום כל ההודעות מכל שרת לגיבוי, אשר לאחר מכן rebroadcast אותם לכל שרתי החווה האחרים.
כדי לאפשר ל- Redis backplane, להתקין את ה-FLT:39 ולהגדיר אותו בסטארט-אפ של ה-OWIN:
app.MapSignalR(new HubConfiguration()
{
EnableDetailedErrors = false
});
GlobalHost.DependencyResolver.UseRedis(new RedisScaleoutOptions("connectionString", "yourApp"));
ללא מטוס אחורי, כל שרת יודע רק על לקוחות מקושרים משלו, כך שהודעות לא יגיעו ללקוחות המחוברים לשרתים אחרים.עבור יישומי ייצור עם יותר משרת יחיד, מטוס אחורי הוא חובה.
ביצועים ועיסוקים טובים
Minimize Hub Method Calls
כל שיחה מלקוח לשרת נכנסת מעל פני הסדרות, שקיפות תחבורה, ועיבוד בצד השרת. להימנע מלקרא לשרת בלולאות צמודות. במקום זאת, רצף עדכונים על הלקוח ושולח אותם במרווח סביר גם, להימנע מהחזרת מטעני תשלום גדולים בכל הודעה; לשקול לשלוח רק נתונים דיפר ותן ללקוח שינויים.
שימוש ב- Efficient Serialization
(הופנה מהדף JSON forסידוריזציה כברירת מחדל, בעוד שנוח, JSON יכול להיות פועלose; אם אתה צריך ביצועים מקסימליים, לשקול שימוש ב-FLT:0MesagePackcioFLT:1 פרוטוקול עבור SignalR, אשר מייצר עומסים קטנים יותר ומפחית את השימוש CPU.זה דורש את חבילת FLT:41 וספרייה מתאימה.
קישורי לקוח קשורים גרייס
תמיד ליישם את ההיגיון של החיבור מחדש של הלקוח.הלקוח של סיג'ואלי בנה מחדש, אבל אתה יכול להתאים את המרווחים החוזרים ואת הניסיונות המקסימליים. בצד השרת, OverrideFLT:42 כדי לנקות משאבים (למשל, להסיר משתמשים מקבוצות, לבטל משימות ארוכות טווח הקשורות לחיבור זה).
שקול גודל הודעה ותדירות
שליחת הודעות גדולות מאוד (למשל, מגה-בתים של נתונים) על פני אותר אינה מומלצת כי היא חוסמת את התחבורה ומגדילה את הכדאיות עבור לקוחות אחרים.אם אתה צריך לשלוח קבצים גדולים, להשתמש במנגנון נפרד כגון העלאה או נקודות קצה ייעודי.עבור עדכונים קטנים תכופים, ודא כי הנתונים דחוסים במידת הצורך, במיוחד על גבי WebSocket.
מקרים של שימוש אמיתי ודוגמאות
Live Dashboards and Monitoring
SignalR הוא אידיאלי עבור לוחות זמנים אמיתיים המציגים מדדים משתנים כגון ביצועי מכירות, בריאות השרת, או אזכורים מדיה חברתית. השרת יכול לדחוף ערכים מעודכנים כל כמה שניות, והלקוח פשוט מעדכן את UI עם MVC, אתה יכול לשרת את המדינה הראשונית לוח המחוונים מן הבקר ולאחר מכן להשתמש ב- SignalR כדי ליישם עדכונים מצטברים, לספק חוויה חלקה.
הודעות מיידיות
הודעות עבור הודעות חדשות, בקשות חבר או התראות מערכת הן התאמה טבעית ל- SignalR. על ידי שימוש הודעות ספציפיות למשתמש, אתה יכול לספק הודעות רק למשתמש המיועד בכל הכרטיסיות או המכשירים הפתוחים שלהם.שלב אות עם מטמון אחסון מקומי מבטיח כי הודעות לא אבדו אם המשתמש היה במצב לא מקוון.
עריכה משותפת ו-Whiteboarding
יישומים הדורשים משתמשים מרובים לשתף פעולה במסמך משותף או ליהנות מההירות הנמוכה של אותר.כל עריכה משודרת לכל משתפי הפעולה בזמן אמת.
מניות צמיגים ו- Live Price Feeds
יישומים פיננסיים לעתים קרובות דורשים עדכונים תת- שנייה של מחירי המניות או שערי מטבע.ה-אלר יכול להתמודד עם אלפי קשרים במקביל ולדחוף עדכונים ברגע שהם מגיעים מהזנת נתונים.על ידי שימוש בקבוצות, באפשרותך לאפשר למשתמשים להירשם למכשירים ספציפיים, צמצום נפח ההודעות שכל לקוח מקבל.
השוואת אותות עם טכנולוגיות אחרות בזמן אמת
Raw WebSocket
יישום WebSocket ישירות נותן לך את השליטה ביותר ואת החלק התחתון של מעל הראש, אבל אתה חייב להתמודד עם סידוריזציה, ניהול ישיבות, תחבורה נפילה, ולהתחבר לוגיקה בעצמך. SignalR מופשט כל זה, מה שהופך אותו הרבה יותר מהר לפתח תכונות בזמן אמת. עבור רוב יישומי MVC, SignalR הוא הבחירה המומלצת אלא אם יש לך דרישות ספציפיות מאוד הדורשות פתרון מותאם אישית.
Socket.IO (Node.js)
Socket.IO הוא המקבילה של SignalR עבור מערכות אקולוגיות Node.js.אם היישום שלך בנוי על Node.js, Socket.IO מציעה נפילה אוטומטית דומה תחבורה וניהול החדר. עם זאת, עבור צוות ממוקד .NET המשתמש ASP.NET MVC, SignalR משלב יותר באופן טבעי עם התשתית הקיימת ואת הכלי.
Firebase Realtime Database
Firebase מספק מסד נתונים מבוסס ענן בזמן אמת עם סינכרוניזציה מובנה ללקוחות.זה שירות מנוהל במלואו, כך שאתה נמנע מניהול השרת, אבל זה מוסיף את הספק Lock-in וייתכן כי יקר יותר בקנה מידה. SignalR נותן לך שליטה מלאה על השרת וניתן לאחסן בכל מקום, מה שהופך אותו מתאים יותר עבור יישומים הדורשים עסקים לוגיים מותאם אישית בצנרת העדכון.
מסקנה
יישום העדכונים בזמן אמת ביישומים MVC עם SignalR הופך דפי אינטרנט סטטיים לתוך חוויות מרתקות, דינמיות. SignalR מטפל המורכבות של משא ומתן תחבורה, ניהול חיבור, והודעות לשרת-לטווח, ומאפשר לך להתמקד בתכונות בנייה כי לשמור על משתמשים מעודכן ומחוברת.מחיים לוחות נתונים מיידיים ועד הודעות וכלי שיתוף פעולה, SignalR מספק בסיס איתן לכל דרישה בזמן אמת.
על ידי ביצוע השלבים המפורטים במאמר זה, יצירת מרכז, חיבור לקוחות, ומינוף תכונות מתקדמות כמו קבוצות, אימות וסקאלה, אתה יכול להוסיף יכולות בזמן אמת ליישומים הקיימים שלך MVC עם ביטחון.כפי שאתה ממשיך לפתח, מתייחס לתיעוד אות הרשמי עבור תובנות עמוקות יותר לפתרון בעיות.התחל קטן, לבדוק ביסודיות, לצפות ביישום שלך להיות חי באמת.
(ב) לעיין במשאבים הרשמיים:0.ASP.NET SignalationR Documentationationof: 2SignalR Scaleout with RediscioFLT 3:0.NET SignalationR Documentationmentationer Reductions API GuideFLT:5