Posso incorporare sia SignalR che un'API RESTful?


116

Ho un'app Web a pagina singola sviluppata utilizzando ASP.NET. Recentemente ho convertito molti dei metodi web per essere basati su push, utilizzando la libreria SignalR . Ciò velocizzava notevolmente la pagina e riduceva molte delle chiamate al server dalla pagina.

Allo stesso tempo, ho anche esaminato l'API Web ASP.NET RESTful per alcuni dei metodi lato server, con la vera bellezza che consente di creare un'API per applicazioni esterne nello stesso momento in cui sviluppo il applicazione principale (che sarà importante per quello che sto facendo).

Tuttavia, dopo aver esaminato diversi articoli e queste due domande, sembra che i metodi push e WebAPI sembrino due paradigmi completamente diversi per la comunicazione client-server. Sono sicuro di poter creare vari metodi a cui è possibile accedere tramite entrambi i protocolli, ma non sono sicuro se ci siano insidie ​​in questo o se questo sia considerato sciatto - forse c'è un modo più elegante per ottenere ciò che sto mirando per.

Ci sono certamente situazioni in cui voglio che RESTful WebAPI trasmetta eventi tramite un hub SignalR ... L'opposto (SignalR deve sempre accedere all'API Web) sembra meno probabile, ma suppongo ancora possibile.

Qualcuno l'ha fatto? Qualcuno ha consigli o suggerimenti su come procedere? Quale sarebbe la via più elegante da seguire qui?


4
Dai un'occhiata al video da questo post del blog . Spiega esattamente come utilizzare WebAPI con SignalR.
david.

@ david.s Scorrendo quel video, sembra perfetto. Pubblicala come risposta e la contrassegnerò.
mbeasley

Risposte:


85

Dai un'occhiata al video da questo post del blog . Spiega esattamente come utilizzare WebAPI con SignalR.

In sostanza, l'integrazione di API Web + SignalR consiste in questa classe :

public abstract class ApiControllerWithHub<THub> : ApiController
    where THub : IHub
{
    Lazy<IHubContext> hub = new Lazy<IHubContext>(
        () => GlobalHost.ConnectionManager.GetHubContext<THub>()
    );

    protected IHubContext Hub
    {
        get { return hub.Value; }
    }
}

È tutto. :)


43
Per iniziare subito ad aggiungere SignalR all'API Web ASP.NET, inoltra il video al tempo 33:35.
bytefire

Il video non viene caricato su HTTPS, se si dispone di un plug-in del browser per forzare HTTPS potrebbe essere necessario disabilitarlo
JMK

14
@bytefire: in realtà, l'integrazione Web API + SignalR inizia ca. a 55 min.
Dennis

2
@ davids.s: Lo so, sono un po 'in ritardo, ma grazie per il link. Ho aggiunto un estratto per ulteriori lettori.
Dennis

1
No IAppBuilder.MapSignalR ()?
Josh Sutterfield

18

SignalR è in realtà già incorporato nel sorgente WebAPI vNext (4.1).

Se non usi la build RTM, ma invece prendi una build da Codeplex, vedrai che c'è un nuovo progetto chiamato System.Web.Http.SignalRche puoi utilizzare. È stato aggiunto un paio di giorni fa con questo commit: http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Utilizzo di esempio (come menzionato nel commit):

public class ToDoListController : HubController<ToDoListHub>
{
    private static List<string> _items = new List<string>();

    public IEnumerable<string> Get()
    {
        return _items;
    }

    public void Post([FromBody]string item)
    {
        _items.Add(item);
        // Call add on SignalR clients listening to the ToDoListHub
        Clients.add(item);
    }
}

Se per ora non vuoi passare a vNext, puoi sempre usare quel codice come riferimento.

Questa implementazione è molto simile (un po 'più raffinata, include test ecc.) A quanto mostrato da Brad Wilson all'NDC Oslo - http://vimeo.com/43603472


4
L'ho fatto sul server. Ma non riesco a connettere il client. Sai come connettere un client .NET con il server sopra menzionato?
bytefire

3
Sto usando l'API Web 5.2.3 e SignalR 2.2.1 e questa classe non si trova da nessuna parte. Qualcuno conosce la storia? È stato strappato prima di RTM? Alla fine, ho appena copiato la definizione della classe di david., Ma sono curioso di sapere cosa sta succedendo.
Colin

1
@ 40Alpha - Penso che abbiamo finito per avere solo metodi statici nell'hub che utilizzavano GlobalHost.ConnectionManager.GetHubContext () (o l'equivalente ASP.NET Core) e chiamare quei metodi statici dal controller API.
Colin

3

Ecco un video che mostra un'integrazione delle due tecnologie http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 e qui c'è un pacchetto NuGet per l'integrazione https://www.nuget.org/ pacchetti / Microsoft.AspNet.WebApi.SignalR /


2
Questo pacchetto è danneggiato ora, quando si utilizzano contratti di codice con l'applicazione API Web, perché richiede non generico IHubConnectionContext, che è stato sostituito da IHubConnectionContext<T>. La risposta accettata è una strada da percorrere.
Dennis

Sebbene questo possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento per riferimento. Modifica la tua risposta per correggere, quindi contrassegna il tuo post per richiedere l'annullamento dell'eliminazione
Matt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.