Documente Academic
Documente Profesional
Documente Cultură
Aplicatii Real-time cu
SignalR
Lect. dr. Florina Covaci
SignalR
• Creata in 2011 de David Fowler si Damian Edwards
• Adaugata in ASP.NET 2013, rescrisa in ASP.NET Core
• Librarie open-source care simplifica adaugarea de functionalitati in
timp real pentru aplicatiile web
• Functionalitatile in timp real permit codului de tip server-side sa
trimita continut catre clienti instant
• Scenarii de utilizare:
• Aplicatii care necesita actualizari frecvente de la server (ex. jocuri, retele
sociale, sistem de votare, licitatii, harti , aplicatii gps etc)
• Dashboard-uri, aplicatii de monitorizare (ex. actualizari pentru instant sale )
• Aplicatii colaborative (ex. whiteboard, software pentru team-meeting)
• Aplicatii care necesita notificari (ex. retele sociale, email, chat-uri)
Facilitati SignalR
• Realizeaza gestiunea automata a conexiunilor
• Trimite mesaje catre toti clientii conectati simultan (ex. un chat room)
• Trimite mesaje catre un client specificat sau un grup de clienti
• Suport pentru scalare(in situatii cu trafic crescut) incorporat – ex. SQL
Server as a backplane
• Un backplane permite instantelor diferite ale aceleiasi aplicatii SignalR sa
comunice una cu cealalta si sa trimita mesaje clientilor indiferent de
instanta la care sunt conectati client
• ASP.NET Core SignalR a fost rescris cu un model mai simplu pentru scalare –
nu mai permite unui client sa se conecteze la instante diferite pentru cereri
successive (sticky sessions)
Hubs
• SignalR utilizeaza hubs pentru a comunica intre client si server
• Hub– un pipeline de nivel inalt care permite unui client si unui server
sa apeleze metodele celulalt
• In codul server definim metode care sunt apelate de client
• In codul client definim metode care sunt apelate de server
• SignalR gestioneaza mecanismul care face posibila comunicarea in
timp real client-server si server-client
Configurare Hubs
• Configurarea serviciilor necesare prin apelul in metoda
ConfigureServices din Startup.cs
services.AddSignalR();
app.UseRouting();
app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/chathub"); })
Crearea si utilizarea unui hub
• cream o clasa care mostenste clasa de baza Hub
• adaugam metode publice – clientii vor apela metodele publice
[HubMethodName("SendMessageToUser")]
public Task DirectMessage(string user, string message)
{ return Clients.User(user).SendAsync("ReceiveMessage", user,
message);
}
Evenimente la nivel de conexiune
• OnConnectedAsync
• Supracriem metoda pentru a realiza actiuni cand un client se
conecteaza la un hub – ex. adaugam un client la un grup
• Token
• Clientul poate trimite un token. Serverul valideaza token-ul si il utilzeaza
pentru a identifica utilizatorul
• Validarea se realizeaza cand se realizeaza conexiunea, iar pe durata de viata a
conexiunii, serverul nu revalideaza automat tokenul pentru a verifica daca e
necesata revocarea acestuia
Cookie vs. token
• Cookie-urile sunt specifice browserelor
• Trimiterea de cookie-uri din alte aplicatii adauga complexitate sporita
aplicatiei spre deosebire de trimiterea de token-uri
[Authorize]
public class ChatHub : Hub
{
public void SendMessage(string message) { }
[Authorize("DomainRestricted")]
public void ViewUserHistory(string username) { }
}
public class DomainRestrictedRequirement :
AuthorizationHandler<DomainRestrictedRequirement, HubInvocationContext>,
IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext
context, DomainRestrictedRequirement requirement, HubInvocationContext
resource)
{ if (IsUserAllowedToDoThis(resource.HubMethodName, context.User.Identity.Name))
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
private bool IsUserAllowedToDoThis(string hubMethodName, string
currentUsername)
{ return !(currentUsername.Equals(“asdf123@ubbcluj.ro") &&
hubMethodName.Equals("ViewUserHistory", StringComparison.OrdinalIgnoreCase)); }
}
Adaugarea noii politici
• Startup.cs – cream politica DomainRestricted
public void ConfigureServices(IServiceCollection services)
{ // ... other services ...
services
.AddAuthorization(options =>
{ options.AddPolicy("DomainRestricted", policy =>
{ policy.Requirements.Add(new
DomainRestrictedRequirement());
});
});
}
Tracking pentru utilizatori online