Puis-je intégrer à la fois SignalR et une API RESTful?

116

J'ai une application Web d'une seule page développée à l'aide d'ASP.NET. J'ai récemment converti de nombreuses méthodes Web pour qu'elles soient basées sur le push, en utilisant la bibliothèque SignalR . Cela a vraiment accéléré considérablement la page et réduit beaucoup d'appels au serveur depuis la page.

Dans le même temps, j'ai également examiné le RESTful ASP.NET WebAPI pour certaines des méthodes côté serveur, la vraie beauté étant qu'il permet de créer une API pour des applications externes en même temps que je développe le application principale (qui sera importante pour ce que je fais).

Il semble cependant, après avoir examiné plusieurs articles et ces deux questions, que les méthodes push et WebAPI semblent être deux paradigmes totalement différents pour la communication client-serveur. Je suis sûr que je peux créer diverses méthodes accessibles via l'un ou l'autre protocole, mais je ne sais pas s'il y a des écueils à cela ou si cela est considéré comme bâclé - peut-être qu'il existe un moyen plus élégant d'atteindre ce que je vise pour.

Il y a certainement des situations dans lesquelles je veux que le WebAPI RESTful diffuse des événements via un hub SignalR ... Le contraire (SignalR ayant jamais besoin d'accéder au WebAPI) semble moins probable, mais je suppose toujours possible.

Quelqu'un at-il fait ça? Quelqu'un a-t-il des conseils ou des astuces sur la façon de procéder? Quelle serait la manière la plus élégante d'avancer ici?

Mbeasley
la source
4
Jetez un œil à la vidéo de cet article de blog . Il explique exactement comment vous pouvez utiliser WebAPI avec SignalR.
david.s
@ david.s En parcourant cette vidéo, ça a l'air parfait. Postez-la comme réponse et je la marquerai.
mbeasley du

Réponses:

85

Jetez un œil à la vidéo de cet article de blog . Il explique exactement comment vous pouvez utiliser WebAPI avec SignalR.

Essentiellement, l'intégration API Web + SignalR consiste en cette 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; }
    }
}

C'est tout. :)

david.s
la source
43
Pour passer directement à l'ajout de SignalR à l'API Web ASP.NET, transférez la vidéo à l'heure 33:35.
bytefire
La vidéo ne se charge pas sur HTTPS, si vous avez un plugin de navigateur pour forcer HTTPS, vous devrez peut-être le désactiver
JMK
14
@bytefire: en fait, l'intégration API Web + SignalR commence environ. à 55 min.
Dennis
2
@ davids.s: Je sais que je suis un peu en retard, mais merci pour le lien. J'ai ajouté un extrait pour d'autres lecteurs.
Dennis
1
Pas de IAppBuilder.MapSignalR ()?
Josh Sutterfield
18

SignalR est en fait déjà intégré dans la source WebAPI vNext (4.1).

Si vous n'utilisez pas la version RTM, mais que vous récupérez une version de Codeplex, vous verrez qu'il y a un nouveau projet appelé System.Web.Http.SignalRque vous pouvez utiliser. Il a été ajouté il y a quelques jours avec ce commit - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Exemple d'utilisation (comme mentionné dans le 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);
    }
}

Si vous ne souhaitez pas passer à vNext pour le moment, vous pouvez toujours simplement utiliser ce code pour référence.

Cette implémentation est très similaire (un peu plus raffinée, comprend des tests, etc.) à ce que Brad Wilson a montré au NDC Oslo - http://vimeo.com/43603472

Filip W
la source
4
Je l'ai fait sur le serveur. Mais impossible de connecter le client. Savez-vous comment connecter un client .NET au serveur mentionné ci-dessus?
bytefire
3
J'utilise Web API 5.2.3 et SignalR 2.2.1 et cette classe est introuvable. Quelqu'un connaît-il l'histoire? At-il été arraché avant RTM? En fin de compte, je viens de copier la définition de classe de david.s, mais je suis curieux de savoir ce qui se passe.
Colin
1
@ 40Alpha - Je pense que nous avons fini par avoir simplement des méthodes statiques dans le Hub qui utilisaient GlobalHost.ConnectionManager.GetHubContext () (ou l'équivalent ASP.NET Core), et en appelant ces méthodes statiques à partir du contrôleur d'API.
Colin
3

Voici une vidéo montrant une intégration des deux technologies http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 et ici il y a un package NuGet pour l'intégration https://www.nuget.org/ packages / Microsoft.AspNet.WebApi.SignalR /

NinjaCross
la source
2
Ce package est cassé maintenant, lors de l'utilisation de contrats de code avec une application API Web, car il nécessite un non-générique IHubConnectionContext, qui a été remplacé par IHubConnectionContext<T>. La réponse acceptée est une voie à suivre.
Dennis
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien pour référence. Veuillez modifier votre réponse pour corriger cela, puis marquer votre message pour demander la suppression de la suppression
Matt