{"id":32315,"date":"2021-02-24T08:00:00","date_gmt":"2021-02-24T07:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=32315"},"modified":"2021-02-24T10:28:03","modified_gmt":"2021-02-24T09:28:03","slug":"redis-come-backplane-per-scalare-le-tue-applicazioni-blazor","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/","title":{"rendered":"Redis come Backplane per scalare le tue applicazioni Blazor"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"32316\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/blexin-1105x656_blog-redis\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&amp;ssl=1\" data-orig-size=\"1105,656\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"blexin-1105x656_blog-redis\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=300%2C178&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-32316\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis-1024x608.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In un&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/blexin.com\/it\/blog\/riedisegnamo-il-publish-subscribe-con-redis\/\" target=\"_blank\">precedente&nbsp;articolo<\/a>&nbsp; abbiamo visto che \u00e8 possibile utilizzare una tecnologia quale&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/redis.io\/\" target=\"_blank\">Redis<\/a>&nbsp;non solo nel suo uso pi\u00f9 comune, ovvero come database o cache,&nbsp;ma&nbsp;anche come messaging system sfruttando il meccanismo di&nbsp;publish\/subscribe&nbsp;che mette a disposizione.&nbsp;<br>Questa feature,&nbsp;unita alla sua&nbsp;versatilit\u00e0,&nbsp;fanno s\u00ec che possa essere utilizzato per svariate&nbsp;situazioni&nbsp;ed in particolare, come avevamo accennato, pu\u00f2 essere utilizzato per scalare orizzontalmente&nbsp;applicazioni&nbsp;<em>ASP.NET&nbsp;Core&nbsp;SignalR<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core SignalR \u00e8 una libreria che consente ad un server di inviare informazioni ai client senza la necessit\u00e0 di ulteriori richieste per aggiornare le informazioni, rendendo quindi l\u2019applicazione real-time. SignalR \u00e8 sinonimo di WebSocket, protocollo di comunicazione full-duplex, di cui \u00e8 un&#8217;astrazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per fare ci\u00f2, SignalR implementa un meccanismo molto interessante. Al tempo della negoziazione tra client e server, si stabilisce, in base alle loro caratteristiche e alla compatibilit\u00e0 tra esse, il meccanismo di comunicazione da utilizzare che va dal pi\u00f9 performante, WebSocket, al meno performante, Server Sent Events e Long Polling che vengono considerati come meccanismi di fallback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I meccanismi di comunicazione supportati sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>WebSockets<\/strong> &#8211; Si tratta di una connessione bidirezionale instaurata dopo una negoziazione HTTP iniziata dal client. Se il server accetta, si crea un canale bidirezionale sul quale il server pu\u00f2 inviare dati al client (Push Model) senza che quest\u2019ultimo debba richiederli ogni volta.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Server Sent Events<\/strong> &#8211; Si tratta di una connessione monodirezionale instaurata dopo la negoziazione HTTP iniziata dal client. Il canale monodirezionale \u00e8 solo dal server verso il client ed infatti quest\u2019ultimo non pu\u00f2 effettuare ulteriori richieste. Quando necessario, il server invia eventi al client nei quali sono contenuti dati aggiornati.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Long polling<\/strong> &#8211; Tra le tre \u00e8 la tecnica pi\u00f9 vecchia e consiste nell\u2019instaurazione di una connessione che resta aperta finch\u00e9 il server non ha la risposta da inviare al client. Una volta che ha dati da inviare la connessione viene interrotta ed il client ricontatter\u00e0 il server per ricevere aggiornamenti successivi.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Il modo migliore per capire alcuni aspetti di questa libreria \u00e8 farlo attraverso un esempio.<br>\u00c8 possibile scegliere tra diversi framework e librerie per realizzare il front-end per un&#8217;applicazione ASP.NET Core. Ho scelto di utilizzare una delle ultime novit\u00e0 in casa Microsoft ovvero Blazor, un framework per la realizzazione di interfacce web utilizzando C#.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essendo alle prime armi sia con ASP.NET Core SignalR che con Blazor, ho preso spunto dalla documentazione Microsoft, dove possiamo trovare un tutorial per realizzare una delle applicazioni real-time pi\u00f9 semplici che ci pu\u00f2 venire in mente, ovvero una chat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ci sono due modelli di hosting per un\u2019applicazione Blazor:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Blazor Web Assembly &#8211; L\u2019applicazione con le sue dipendenze e il runtime .NET viene eseguita all\u2019interno del browser stesso e la gestione degli eventi e gli aggiornamenti dell\u2019interfaccia avvengono all\u2019interno dello stesso processo.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Blazor Server &#8211; l\u2019applicazione in ASP.NET Core viene eseguita su di un server. La gestione degli eventi e gli aggiornamenti dell\u2019interfaccia client avvengono mediante una connessione SignalR.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"704\" height=\"308\" data-attachment-id=\"32322\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image1-7\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image1.png?fit=704%2C308&amp;ssl=1\" data-orig-size=\"704,308\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image1.png?fit=300%2C131&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image1.png?fit=704%2C308&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image1.png?resize=704%2C308&#038;ssl=1\" alt=\"\" class=\"wp-image-32322\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image1.png 704w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image1-480x210.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 704px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Per il nostro esempio sceglieremo quest\u2019ultimo.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per prima cosa creiamo un nuovo progetto con il comando:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndotnet new blazorserver -o ProjectName\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Dove ProjectName \u00e8 il nome che vogliamo dare al progetto.<br>Fatto ci\u00f2, ci ritroveremo davanti ad un\u2019applicazione gi\u00e0 funzionante dalla quale, per\u00f2, abbiamo rimosso le pagine di esempio e la logica ad esse collegata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Non mostreremo l\u2019intero progetto (potete trovare il link al repository GitHub alla fine dell\u2019articolo) ma solo le componenti essenziali e rilevanti per spiegare alcuni concetti fondamentali di SignalR.<br>Tra questi sicuramente c\u2019\u00e8 il concetto di Hub. Un hub \u00e8 una pipeline che consente ad un client di invocare i metodi del server e al server di invocare metodi del client rendendo possibile la comunicazione real-time tra le due parti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Installiamo il pacchetto NuGet <em>Microsoft.AspNetCore.SignalR.Client <\/em>all\u2019interno del nostro progetto e creiamo un hub che chiameremo <em>ChatHub<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing System; \n\nusing System.Threading.Tasks; \n\nusing Microsoft.AspNetCore.SignalR; \n\n namespace BlazorWithRedisBackPlane.Chat \n\n{ \n\n    public class ChatHub: Hub \n\n    { \n\n        public const string HubUrl = &quot;\/chat&quot;; \n\n  \n        public async Task SendMessageToAll(string username, string message) \n\n        { \n\n            await Clients.All.SendAsync(&quot;ReceiveMessage&quot;, username, message); \n\n        } \n\n  \n        public override Task OnConnectedAsync() \n\n        { \n\n            Console.WriteLine($&quot;{Context.ConnectionId} connected&quot;); \n\n            return base.OnConnectedAsync(); \n\n        } \n\n\n        public override  async Task OnDisconnectedAsync(Exception exception) \n\n        { \n\n            Console.WriteLine($&quot;Disconnected {exception?.Message} {Context.ConnectionId}&quot;); \n\n            await base.OnDisconnectedAsync(exception); \n\n        } \n\n     } \n\n} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come possiamo vedere, questa classe eredita dalla classe base Hub propria di SignalR e definisce quindi l\u2019hub che utilizzeremo in questa applicazione.<br>Definiamo un campo HubUrl che rappresenter\u00e0 la rotta verso il nostro hub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il primo dei tre metodi definiti \u00e8 <em>SendMessageToAll() <\/em>che utilizzeremo per definire ci\u00f2 che andr\u00e0 fatto quando un utente della chat invia un messaggio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizziamo l\u2019oggetto <em>Clients<\/em>, fornito sempre da SignalR, che ci consente di invocare metodi sui client connessi a tale hub. Con <em>Clients.All<\/em> indichiamo che il metodo sia invocato su tutti i client connessi all\u2019hub mentre mediante il metodo <em>SendAsync()<\/em> andiamo a specificare il nome del metodo invocato per tutti i client connessi all\u2019hub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gli altri due metodi invece sono override dei metodi della classe base Hub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OnConnectedAsync() viene invocato quando viene instaurata una nuova connessione con l\u2019hub mentre quando questa connessione termina viene invocato il metodo OnDisconnectedAsync().<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In entrambi, utilizziamo l\u2019oggetto Context presente nella libreria, che contiene le informazioni legate alle connessioni in atto come ad esempio il <em>ConnectionId<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Definiamo adesso l\u2019interfaccia e la logica del nostro client. Come detto in precedenza, quando creiamo un nuovo progetto ci viene fornito qualcosa di gi\u00e0 funzionante con delle pagine di esempio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"313\" height=\"157\" data-attachment-id=\"32329\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image2-6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image2.png?fit=313%2C157&amp;ssl=1\" data-orig-size=\"313,157\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image2.png?fit=300%2C150&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image2.png?fit=313%2C157&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image2.png?resize=313%2C157&#038;ssl=1\" alt=\"\" class=\"wp-image-32329\" srcset=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image2.png?w=313&amp;ssl=1 313w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image2.png?resize=300%2C150&amp;ssl=1 300w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Alcune di queste sono state rimosse ed \u00e8 stato sostituito il codice all\u2019interno della pagina Index.razor per realizzare la nostra chat.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; auto-links: false; title: ; notranslate\" title=\"\">\n@page &quot;\/&quot; \n\n@inject NavigationManager navigationManager \n\n@using Microsoft.AspNetCore.SignalR.Client; \n\n@using BlazorWithRedisBackPlane.Chat; \n\n \n@if (!_isChatting) \n\n{ \n\n    &lt;p&gt; \n\n        Enter your name:  \n\n    &lt;\/p&gt; \n\n  \n    &lt;input type=&quot;text&quot; maxlength=&quot;32&quot; @bind=&quot;@_username&quot;\/&gt; \n\n    &lt;button type=&quot;button&quot; @onclick=&quot;@Chat&quot;&gt;&lt;span class=&quot;oi oi-chat&quot; aria-hidden=&quot;true&quot;&gt;&lt;\/span&gt; Start a chat &lt;\/button&gt; \n\n} \n\nelse \n\n{  \n\n    &lt;div&gt; \n\n        &lt;span&gt;User: &lt;b&gt;@_username&lt;\/b&gt;&lt;\/span&gt; \n\n    &lt;\/div&gt; \n\n    &lt;div id=&quot;scrollbox&quot;&gt; \n\n        @foreach (var item in _chatMessages) \n\n        { \n\n            &lt;div class=&quot;@item.Style&quot;&gt; \n\n                &lt;div class=&quot;user&quot;&gt;@item.Username&lt;\/div&gt; \n\n                &lt;div class=&quot;msg&quot;&gt;@item.Body&lt;\/div&gt; \n\n            &lt;\/div&gt;             \n\n        } \n\n        &lt;hr \/&gt; \n\n        &lt;textarea class=&quot;input&quot; placeholder=&quot;enter your message&quot; @bind=&quot;@_newMessage&quot;&gt;&lt;\/textarea&gt; \n\n        &lt;button class=&quot;btn btn-default&quot; style=&quot;border-color:grey&quot; @onclick=&quot;@(() =&gt; SendAsync(_newMessage))&quot;&gt;Send&lt;\/button&gt; \n\n    &lt;\/div&gt; \n\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@code { \n\n    private bool _isChatting = false; \n\n    private string _username; \n\n    private string _message; \n\n    private string _newMessage; \n\n    private List&lt;Message&gt; _chatMessages = new List&lt;Message&gt;(); \n\n    private string _chatHubUrl; \n\n    private HubConnection _hubConnection; \n\n  \n\n    public async Task Chat() \n\n    { \n\n         if (string.IsNullOrWhiteSpace(_username)) \n\n        { \n\n            _message = &quot;Please enter a name&quot;; \n\n            return; \n\n        }; \n\n          \n\n        try \n\n        { \n\n            _isChatting = true; \n\n            await Task.Delay(1); \n\n  \n\n            _chatMessages.Clear(); \n\n            _chatHubUrl = navigationManager.BaseUri.TrimEnd(&#039;\/&#039;) + ChatHub.HubUrl;  \n\n  \n\n            _hubConnection = new HubConnectionBuilder() \n\n                .WithUrl(_chatHubUrl) \n\n                .Build(); \n\n  \n\n            _hubConnection.On&lt;string, string&gt;(&quot;ReceiveMessage&quot;, HandleMessage); \n\n  \n\n            await _hubConnection.StartAsync(); \n\n        } \n\n        catch (Exception e) \n\n        { \n\n            _message = $&quot;ERROR: Failed to start chat client: {e.Message}&quot;; \n\n            _isChatting = false; \n\n        } \n\n    } \n\n  \n    private void HandleMessage(string name, string message) \n\n    { \n\n        bool isMine = name.Equals(_username, StringComparison.OrdinalIgnoreCase); \n\n  \n\n        _chatMessages.Add(new Message(name, message, isMine)); \n\n  \n        \/\/ Inform blazor the UI needs updating \n\n        StateHasChanged(); \n\n    } \n\n  \n    private async Task SendAsync(string message) \n\n    { \n\n        if (_isChatting &amp;&amp; !string.IsNullOrWhiteSpace(message)) \n\n        { \n\n            await _hubConnection.SendAsync(&quot;SendMessageToAll&quot;, _username, message); \n\n  \n            _newMessage = string.Empty; \n\n        } \n\n  \n    } \n\n  \n    private class Message \n\n    { \n\n        public Message(string username, string body, bool mine) \n\n        { \n\n            Username = username; \n\n            Body = body; \n\n            IsMine = mine; \n\n        } \n\n  \n        public string Username { get; set; } \n\n        public string Body { get; set; } \n\n        public bool IsMine { get; set; } \n\n        public string Style =&gt; IsMine ? &quot;sent&quot; : &quot;received&quot;; \n\n    } \n\n} \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il file \u00e8 nettamente diviso in due parti che interagiscono tra loro. Nella prima parte, viene definito il layout della pagina in HTML e la logica con cui possiamo rappresentare all\u2019interno di essa le varie componenti mediante la sintassi <em>Razor<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con la direttiva <em>@code<\/em> invece indichiamo la parte di codice in cui possono essere definiti gli attributi ed i metodi della classe che verr\u00e0 generata in fase di compilazione e che prender\u00e0 il nome del file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le parti interessanti di questa classe sono i tre metodi <em>Chat(), HandleMessage()<\/em> e <em>SendAsync()<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il primo viene invocato quando l\u2019utente inserisce il proprio username e inizializza la chat.<br>Con l\u2019ausilio di un <em>HubConnectionBuilder()<\/em> andiamo a creare una <em>HubConnection<\/em> che ci consente di invocare i metodi degli hub in un Server SignalR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Infatti con l\u2019istruzione:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n_hubConnection.On&amp;lt;string, string&gt;(&quot;ReceiveMessage&quot;, HandleMessage); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">si registra un<em> handler <\/em>di nome <em>HandleMessage(<\/em>), che verr\u00e0 invocato a seguito dell\u2019invocazione del metodo <em>ReceiveMessage <\/em>presente nell\u2019hub.<br>Infine, viene inizializzata la connessione al server con il metodo <em>_hubConnection.StartAsync()<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando l\u2019utente inserisce un messaggio, invece, viene invocato il metodo SendAsync() che a sua volta andr\u00e0 ad invocare il metodo dell\u2019hub specificato, che in questo caso \u00e8 \u201cSendMessageToAll\u201d.<br>Questo significa che, siccome nell\u2019hub il metodo \u201cSendMessageToAll\u201d scatena a sua volta il metodo Client \u201cReceiveMessage\u201d che abbiamo collegato all\u2019handler HandleMessage(). Verr\u00e0 quindi eseguito quest\u2019ultimo che non far\u00e0 altro che aggiungere alla lista dei messaggi quello inserito dall\u2019utente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Infine, non resta che aggiungere all\u2019interno del file Startup.cs ed in particolare nella configurazione degli EndPoints quella relativa al ChatHub che abbiamo definito<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nendpoints.MapHub&amp;lt;ChatHub&gt;(ChatHub.HubUrl); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Eseguiamo l\u2019applicazione per provare il funzionamento della nostra chat in due finestre del browser.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"234\" data-attachment-id=\"32341\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image3-6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image3.png?fit=1277%2C292&amp;ssl=1\" data-orig-size=\"1277,292\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image3\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image3.png?fit=300%2C69&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image3.png?fit=1024%2C234&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image3.png?resize=1024%2C234&#038;ssl=1\" alt=\"\" class=\"wp-image-32341\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image3-1024x234.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image3-980x224.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image3-480x110.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Una volta inseriti i due user inviamo un messaggio per parte.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"350\" data-attachment-id=\"32343\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image4-6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image4.png?fit=1277%2C437&amp;ssl=1\" data-orig-size=\"1277,437\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image4\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image4.png?fit=300%2C103&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image4.png?fit=1024%2C350&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image4.png?resize=1024%2C350&#038;ssl=1\" alt=\"\" class=\"wp-image-32343\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image4-1024x350.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image4-980x335.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image4-480x164.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Come possiamo vedere, la chat funziona correttamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nell\u2019esempio mostrato, abbiamo usato due istanze del browser per i due client ma l\u2019applicazione server \u00e8 sempre la stessa.<br>Nel caso di applicazioni real-time o comunque in generale quando un\u2019applicazione deve servire un gran numero di client c\u2019\u00e8 necessit\u00e0 che l\u2019applicazione venga scalata orizzontalmente. In questo caso, pu\u00f2 risultare un problema, perch\u00e9, come abbiamo visto, SignalR fa in modo che sia il server a gestire le connessioni e quindi ci ritroveremmo nella situazione descritta in figura:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"339\" data-attachment-id=\"32346\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image5-5\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?fit=480%2C339&amp;ssl=1\" data-orig-size=\"480,339\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image5\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?fit=300%2C212&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?fit=480%2C339&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?resize=480%2C339&#038;ssl=1\" alt=\"\" class=\"wp-image-32346\" srcset=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?w=480&amp;ssl=1 480w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?resize=300%2C212&amp;ssl=1 300w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image5.png?resize=400%2C284&amp;ssl=1 400w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">in cui le istanze di SignalR sui vari server non hanno conoscenza delle connessioni presenti sugli altri.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per fare un esempio pi\u00f9 vicino al caso reale, creiamo un&#8217;immagine Docker per la nostra applicazione e istanziamo due container all\u2019interno di una <em>Docker network<\/em>.<br>Per creare l\u2019immagine Docker della nostra applicazione, possiamo generare molto semplicemente il <em>dockerfile <\/em>utilizzando l\u2019<a rel=\"noreferrer noopener\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-azuretools.vscode-docker\" target=\"_blank\">estensione Docker ufficiale<\/a> per Visual Studio Code oppure l\u2019<em>utility<\/em> fornita da Visual Studio per Windows, <em>Docker Support<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"663\" height=\"382\" data-attachment-id=\"32348\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image6-5\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image6.png?fit=663%2C382&amp;ssl=1\" data-orig-size=\"663,382\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image6\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image6.png?fit=300%2C173&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image6.png?fit=663%2C382&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image6.png?resize=663%2C382&#038;ssl=1\" alt=\"\" class=\"wp-image-32348\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image6.png 663w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image6-480x277.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 663px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di procedere per\u00f2 dobbiamo fare una piccola modifica per \u201cbypassare\u201d un problema legato al redirection dell&#8217;HTTPs che non ci consente di avviare la connessione al server (<a href=\"https:\/\/github.com\/dotnet\/dotnet-docker\/issues\/2129\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/dotnet\/dotnet-docker\/issues\/2129<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel file <em>Startup.cs<\/em> bisogna commentare l\u2019istruzione:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\napp.UseHttpsRedirection(); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Inoltre, all\u2019interno di <em>Index.razor<\/em> \u00e8 necessario specificare l\u2019URL della connessione al ChatHub in questo modo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; title: ; notranslate\" title=\"\">\nstring baseUrl = &quot;http:\/\/localhost&quot;; \n\n_chatHubUrl = baseUrl + ChatHub.HubUrl; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Possiamo quindi creare l\u2019immagine della nostra applicazione lanciando il comando:&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; title: ; notranslate\" title=\"\">\ndocker build -t blazorchat:1 . \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Creiamo adesso una rete docker:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; title: ; notranslate\" title=\"\">\ndocker network create --subnet=192.168.0.0\/16 chat-network \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">e creiamo due container assegnando gli indirizzi IP all\u2019interno della rete appena creata:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Server1<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndocker run -h server1 --net chat-network --ip 192.168.0.5 -p 5000:80 --name server1  blazorchat:1\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Server2<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndocker run -h server2 --net chat-network --ip 192.168.0.6 -p 5001:80 --name server2  blazorchat:1\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Se, come nell\u2019esempio fatto in precedenza, ci colleghiamo all\u2019indirizzo <a href=\"http:\/\/localhost:5000\/\" rel=\"nofollow\">http:\/\/localhost:5000\/<\/a><br>utilizzando due finestre diverse del browser otteniamo esattamente lo stesso risultato.<br>Ma se per un client utilizziamo Server1 (<a href=\"http:\/\/localhost:5000\/\" rel=\"nofollow\">http:\/\/localhost:5000\/<\/a>) e per l\u2019altro client Server2  (<a href=\"http:\/\/localhost:5001\/\" rel=\"nofollow\">http:\/\/localhost:5001\/<\/a>) avremo questa situazione:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"350\" data-attachment-id=\"32355\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image7-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image7.png?fit=1277%2C437&amp;ssl=1\" data-orig-size=\"1277,437\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image7\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image7.png?fit=300%2C103&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image7.png?fit=1024%2C350&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image7.png?resize=1024%2C350&#038;ssl=1\" alt=\"\" class=\"wp-image-32355\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image7-1024x350.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image7-980x335.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image7-480x164.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I due client non comunicano: \u00e8 esattamente ci\u00f2 che stavamo provando a descrivere prima, ovvero che le connessioni di SignalR sono indipendenti fra i vari server.<br>Per ovviare a questa situazione, ci sono diverse soluzioni tra cui l\u2019utilizzo di Redis come <strong>BackPlane<\/strong>. Il termine backplane viene dall&#8217;elettronica e si riferisce ad un insieme di connettori collegati in parallelo tra loro, in modo che ogni pin di uno sia collegato ai corrispondenti pin degli altri andando a formare cos\u00ec un bus di comunicazione (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Backplane\" rel=\"nofollow\">https:\/\/en.wikipedia.org\/wiki\/Backplane<\/a>). Allo stesso modo \u00e8 possibile utilizzare Redis per far comunicare i diversi nodi su cui \u00e8 in esecuzione l&#8217;applicazione SignalR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019applicazione invia al backplane sia le informazioni legate alle connessioni dei client sia i vari messaggi ricevuti.<br>Attraverso un meccanismo di publish\/subscribe, il backplane di Redis ha tutte le informazioni per instradare correttamente tutti i messaggi tra tutti i client e i server ai quali sono collegati.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"625\" height=\"340\" data-attachment-id=\"32358\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image8-3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image8.png?fit=625%2C340&amp;ssl=1\" data-orig-size=\"625,340\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image8\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image8.png?fit=300%2C163&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image8.png?fit=625%2C340&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image8.png?resize=625%2C340&#038;ssl=1\" alt=\"\" class=\"wp-image-32358\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image8.png 625w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image8-480x261.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 625px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Proviamo nuovamente a riprodurre lo scenario dell\u2019esempio precedente introducendo stavolta Redis come backplane.<br>Istanziamo un container basato sull\u2019immagine di Redis all\u2019interno della rete Docker definita in precedenza.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndocker run -h redis --net chat-network --ip 192.168.0.7 --name redisbackplane -p 6379:6379 -d redis \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aggiungiamo alla nostra applicazione il pacchetto NuGet <em>Microsoft.AspNetCore.SignalR.StackExchangeRedis<\/em> ed una volta installato aggiungiamo all&#8217;interno del metodo <em>ConfigureServices()<\/em> l\u2019istruzione:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nservices.AddSignalR().AddStackExchangeRedis(&quot;192.168.0.7&quot;); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Avendo modificato l\u2019applicazione andiamo a creare una nuova immagine:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; title: ; notranslate\" title=\"\">\ndocker build -t blazorchat:2 . \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Creiamo&nbsp;nuovamente i due container,&nbsp;questa volta aggiungendo come&nbsp;<em>host&nbsp;<\/em>il server&nbsp;Redis:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Server1<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndocker run -h server1 --net chat-network --ip 192.168.0.5 --add-host redis:192.168.0.7 -p 5000:80 --name server1 blazorchat:2\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Server2<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndocker run -h server2 --net chat-network --ip 192.168.0.6 --add-host redis:192.168.0.7 -p 5001:80 --name server2 blazorchat:2 \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">In questo caso, se ci colleghiamo al Server1 (<a href=\"http:\/\/localhost:5000\/\" rel=\"nofollow\">http:\/\/localhost:5000\/<\/a>) e al Server2(<a href=\"http:\/\/localhost:5001\/\" rel=\"nofollow\">http:\/\/localhost:5001\/<\/a>) e proviamo la nostra chat, avremo finalmente la comunicazione tra le due istanze della nostra applicazione.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"350\" data-attachment-id=\"32365\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image9-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image9.png?fit=1277%2C437&amp;ssl=1\" data-orig-size=\"1277,437\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image9\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image9.png?fit=300%2C103&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image9.png?fit=1024%2C350&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image9.png?resize=1024%2C350&#038;ssl=1\" alt=\"\" class=\"wp-image-32365\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image9-1024x350.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image9-980x335.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image9-480x164.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Inoltre, possiamo vedere l\u2019attivit\u00e0 sul backplane collegandoci al container Redis e utilizzando il comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nredis-cli monitor\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"117\" data-attachment-id=\"32368\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/attachment\/image10-9\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image10.png?fit=1719%2C197&amp;ssl=1\" data-orig-size=\"1719,197\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image10\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image10.png?fit=300%2C34&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image10.png?fit=1024%2C117&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/image10.png?resize=1024%2C117&#038;ssl=1\" alt=\"\" class=\"wp-image-32368\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image10-980x112.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/02\/image10-480x55.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Spero che sia stato interessante vedere un altro modo per sfruttare la versatilit\u00e0 di Redis ed utilizzarlo per aiutarci nello scaling di una nostra applicazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Potete trovare il codice del progetto con il dockerfile al <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/intersect88\/BlazorChatWithRedisBackPlane\" target=\"_blank\">seguente link<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inoltre, se siete interessati a Blazor vi invito a seguire la community<a rel=\"noreferrer noopener\" href=\"https:\/\/blazordev.it\/\" target=\"_blank\"> Blazor Developer Italiani<\/a>, fondata dal nostro CEO Michele Aponte, e la conferenza <a rel=\"noreferrer noopener\" href=\"https:\/\/blazorconf.it\/\" target=\"_blank\">BlazorConf2021<\/a> in programma a marzo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo come Redis consente di scalare orizzontalmente applicazioni ASP.NET Core SignalR con Blazor <\/p>\n","protected":false},"author":196716251,"featured_media":32316,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false},"categories":[688637374],"tags":[688637414,688637459],"class_list":["post-32315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-asp-net-core","tag-blazor"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Redis come Backplane per scalare le tue applicazioni Blazor - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Redis come Backplane per scalare le tue applicazioni Blazor - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo come Redis consente di scalare orizzontalmente applicazioni ASP.NET Core SignalR con Blazor\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-24T07:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-02-24T09:28:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1105\" \/>\n\t<meta property=\"og:image:height\" content=\"656\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Genny Paudice\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Genny Paudice\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\"},\"author\":{\"name\":\"Genny Paudice\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"headline\":\"Redis come Backplane per scalare le tue applicazioni Blazor\",\"datePublished\":\"2021-02-24T07:00:00+00:00\",\"dateModified\":\"2021-02-24T09:28:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\"},\"wordCount\":1835,\"image\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1\",\"keywords\":[\"Asp.net core\",\"Blazor\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\",\"url\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\",\"name\":\"Redis come Backplane per scalare le tue applicazioni Blazor - Blexin\",\"isPartOf\":{\"@id\":\"https:\/\/blexin.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1\",\"datePublished\":\"2021-02-24T07:00:00+00:00\",\"dateModified\":\"2021-02-24T09:28:03+00:00\",\"author\":{\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"breadcrumb\":{\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1\",\"width\":1105,\"height\":656},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blexin.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Redis come Backplane per scalare le tue applicazioni Blazor\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blexin.com\/it\/#website\",\"url\":\"https:\/\/blexin.com\/it\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blexin.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973\",\"name\":\"Genny Paudice\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blexin.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"caption\":\"Genny Paudice\"},\"url\":\"https:\/\/blexin.com\/it\/author\/genny-paudiceblexin-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Redis come Backplane per scalare le tue applicazioni Blazor - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/","og_locale":"it_IT","og_type":"article","og_title":"Redis come Backplane per scalare le tue applicazioni Blazor - Blexin","og_description":"Vediamo come Redis consente di scalare orizzontalmente applicazioni ASP.NET Core SignalR con Blazor","og_url":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/","og_site_name":"Blexin","article_published_time":"2021-02-24T07:00:00+00:00","article_modified_time":"2021-02-24T09:28:03+00:00","og_image":[{"width":1105,"height":656,"url":"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1","type":"image\/png"}],"author":"Genny Paudice","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Genny Paudice","Tempo di lettura stimato":"12 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/"},"author":{"name":"Genny Paudice","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"headline":"Redis come Backplane per scalare le tue applicazioni Blazor","datePublished":"2021-02-24T07:00:00+00:00","dateModified":"2021-02-24T09:28:03+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/"},"wordCount":1835,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1","keywords":["Asp.net core","Blazor"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/","url":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/","name":"Redis come Backplane per scalare le tue applicazioni Blazor - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1","datePublished":"2021-02-24T07:00:00+00:00","dateModified":"2021-02-24T09:28:03+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1","width":1105,"height":656},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/redis-come-backplane-per-scalare-le-tue-applicazioni-blazor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Redis come Backplane per scalare le tue applicazioni Blazor"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973","name":"Genny Paudice","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","caption":"Genny Paudice"},"url":"https:\/\/blexin.com\/it\/author\/genny-paudiceblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/02\/blexin-1105x656_blog-redis.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-8pd","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716251"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=32315"}],"version-history":[{"count":39,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32315\/revisions"}],"predecessor-version":[{"id":34026,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32315\/revisions\/34026"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/32316"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=32315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=32315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=32315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}