Podle kategorie

C#, .NET Core 2.1, SignalR - díl 1.; aneb logování z front-endu

Daniel Vittek       27.11.2018       C#, .NET, .NET Tips       979 zobrazení

S kolegou píšeme aplikaci, ve které si děláme vlastní systém překladů. Po nějaké době jsme došli k závěru, že potřebujeme efektivní způsob, jak upozorňovat na chybějící překlady. Přeci-jenom některé jsou opravdu kritické. Nechtěli bychom narazit např. na to, že nám chybí překlad v nějakém zapomenutém jazyku v registračním formuláři..

Po nějaké době brainstormingu jsme se rozhodli, že budeme tento “typ chyby” zaznamenávat logováním přes SignalR. S touto technologií jsem se teprve seznamoval a velice příjemně mě překvapila jednoduchost a přímočarost implementace. Rozhodl jsem se tedy, že se o zkušenost podělím.

C# .NET Core 2.1 implementace

Nejprve je pochopitelně nutné nainstalovat nuget balíček SignalR. V tomto případě si postačíme s jedním a to: Microsoft.AspNetCore.SignalR.Client.

Další krok bude inicializační proces. Ve tříde ‘Startup.cs’ přidáme něco jako:

 protected override void CustomConfigureServices(IServiceCollection services)
{
     services.AddSignalR();
} 

Tímto máme prozatím ve ‘Startup.cs’ tříde hotovo. SignalR je připraven k použití. O registraci do DI se nemusíme starat, to za nás obstará Core sám (jediné, co je posléze nutno registrovat do DI je HubContext<T>, ale ten tentokrát nezajímá, protože ho potřebovat nebudeme).

Dále budeme muset vytvořit náš logovací ‘Hub<T>’. Prvně si vytvoříme ale interface. Tento interface nám definuje které funkce budeme moci přes již zmíněný Hub volat a jak budou vypadat.

  
 public interface ILogHub
 {
     Task CallLog(string message);
 }
 

A konečně několikrát zmiňovaný Hub:

public class LogHub : Hub<ILogHub>
{
    public async Task CallLog(string value) => await Clients.All.CallLog(value);
} 

Zde můžeme vidět asynchronní Task “CallLog(string value)”. Tímto definujeme, že pro klienty, kteří se připojí k našemu SignalR vystavujeme možnost volání funkce “CallLog”, která akceptuje jeden textový parametr. Ve chvíli, kdy někdo tuto funkci zavolá, SignalR zprávu přepošle všem připojeným klientům ( “await Clients.All.CallLog(value);” ). Možnosti volat funcki “CallLog” na objektu “Clients.All” jsme dosáhli naším interfacem, který jsme předložily třídě “Hub”, ze které náš “LogHub” dědí.

Pokud bychom chtěli Hub bez interfacu, šlo by to udělat takhle:

 public class LogHub : Hub
{
    public async Task CallLog(string value) => await Clients.All.SendCoreAsync("CallLog", new object[]{value}, CancellationToken.None);
} 

V tuto chvíli se budeme ještě muset vrátit do třídy “Startup.cs” a hub namapovat.

protected override void CustomConfigure(IApplicationBuilder app)
{
    app.UseCors(b => b.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials());
    app.UseSignalR((options) => { options.MapHub<LogHub>("Hubs/Log"); });
} 

Naschvál vkládám ještě blok kódu, který vypíná CORS. Setkal jsem se s mnoha problémy, které mi způsoboval právě CORS, proto jsem se rozhodl ho zatím (alespoň ve vývojové fázi vypnout). A ano..je důležité ho vypnout dřív, než mapovat Hub, na tom jsem také strávil nějakou chvilku.

Tímto vlastně máme implementaci SignalR, co se týče host stránky hotovou. Můžeme se tedy vrhnout na implementaci klienta.

C# .NET Core 2.1 implementace klienta

Zde se opravdu znovu nesetkáme s dlouhým, složitým kódem – vše je jednoduché, rychlé a krásné!

 private async void ConfigureAndStartSignalRClient()
{
     var connection = new HubConnectionBuilder().WithUrl("http://localhost:4323/Hubs/Log").Build();
     await connection.StartAsync();
     connection.On<string>("CallLog", CallLogHandler);

    connection.Closed += async (error) =>               //pokud se spojení zruší, počkám pár vteřim a zkusím se připojit znovu
     {
         Log.Error().Message(error.ToString());
         await Task.Delay(new Random().Next(0, 5) * 1000);
         await connection.StartAsync();
     };
}

private void CallLogHandler(string obj)
{
     throw new NotImplementedException(); //logika zpracování zprávy
} 

A tímto máme hotovo! Implementace na pár minutek, když víte, co děláte. :)

Pro první díl je to vše. V příštím díle si ukážeme implementaci na straně FE (JS), jak pracovat s “HubContext<T>” a tak dále.

Jako vždy budu vděčný za jakékoliv připomínky, či dotazy.

Dokumentace SignalR: https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-2.1

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback