Capire HubConnection di SignalR da una prospettiva SignalNet .Net Client

0

Se posso sottolineare che non ho un problema con il codice né il requisito per la revisione del codice, quindi la pubblicazione qui.

In generale, sto cercando una migliore comprensione su come progettare veramente un progetto SignalR .Net Client per impedire la creazione di più HubConnections .

I / Abbiamo un prototipo in un ambiente di staging, che trasferisce con successo le informazioni di stampa dai centri di distribuzione remoti alla nostra app.

Ciò che veramente mi confonde è che sto creando un'istanza di HubConnection ogni volta che ho bisogno di inviare un messaggio a cui si accede direttamente sull'Hub, non su un endpoint di API.

Per favore, permettimi di dimostrare un codice, quindi il nostro sistema parla con un API bloccato, che poi parla con un hub ospitato altrove dove.

    [IdentityBasicAuthentication]
    [Authorize]
    [RoutePrefix("api/v1")]
    public class PrinterStatusV1Controller : ApiController
    {
        //logic removed
        private HubConnection _hubConnection;

        public PrinterStatusV1Controller()
        {   
            //logic removed
        }

        [HttpPost]
        [Route("dummy")]
        public async Task<IHttpActionResult> AddPrinterStatusAsync([FromBody]PrinterStatus printerStatus)
        {
            try
            {
                var identity = User.Identity as ClaimsIdentity;

                var identityInstance = new IdentityInstance(identity);
                if (identityInstance == null)
                    return StatusCode(HttpStatusCode.Forbidden);

                if (printerStatus == null)
                    return NotFound();

                IHubProxy aProxy = Create(dummy);

                if(printerProxy != null)
                    await printerProxy.Invoke("dummy", dummy);

                await _printerStatusRepo.Dummy(dummy);
                return Ok();
            }
            catch (System.Exception ex)
            {
                return InternalServerError();
            }
        }
        private IHubProxy Create(string dummy)
        {
            try
            {
                /logic removed
                _hubConnection = new HubConnection("dummy", dictionary);
                var hubProxy = _hubConnection.CreateHubProxy("dummy");
                _hubConnection.Start().Wait();

                _hubConnection.Closed += () => {
                    var connected = false;
                    while (!connected)
                    {
                        System.Threading.Thread.Sleep(2000);
                        _hubConnection = new HubConnection("dummy", dictionary);
                        hubProxy = _hubConnection.CreateHubProxy("dummy");
                        _hubConnection.Start().Wait();
                        connected = true;
                    }
                };

                return hubProxy;
            }
            catch
            {
                return null;
            }
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_hubConnection != null)
                {
                    _hubConnection.Stop();
                    _hubConnection.Dispose();
                }

                //logic removed
            }
            base.Dispose(disposing);
        }
    }
}

Dovrei arrivare al punto, qual è generalmente il miglior modello / architettura per evitare di creare un HubConnection , ogni volta che chiamo un endpoint? ogni suggerimento è molto apprezzato. Posso mettere in atto molte astrazioni, ma in teoria sto creando un'istanza di un nuovo HubConnection ogni volta.

    
posta Tez Wingfield 22.12.2017 - 17:36
fonte

1 risposta

0

Conserva un riferimento a un oggetto HubConnection e riutilizzalo per le successive chiamate API.

Questo può essere fatto in molti modi diversi, senza complicare eccessivamente la tua architettura. Ad esempio, se stai utilizzando un contenitore DI, puoi dire al tuo contenitore di utilizzare una durata di Singleton, in modo che quando chiedi un oggetto HubConnection , ottieni sempre lo stesso valore.

I membri di istanza di HubConnection non sono thread-safe. Trattali di conseguenza.

    
risposta data 23.12.2017 - 18:06
fonte

Leggi altre domande sui tag