114 votes

Est-il possible d'incorporer à la fois SignalR et une API RESTful?

J'ai une application web d'une seule page développée en utilisant ASP.NET. J'ai récemment converti beaucoup de mes méthodes web pour être basées sur des push, en utilisant la bibliothèque SignalR. Cela a vraiment accéléré considérablement la page et a réduit beaucoup d'appels serveur à partir de la page.

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

Il semble cependant, après avoir lu plusieurs articles et ces deux questions, que les méthodes de push et WebAPI semblent être deux paradigmes entièrement différents pour la communication client-serveur. Je suis sûr que je peux créer diverses méthodes qui peuvent être accessibles via l'un ou l'autre protocole, mais je ne suis pas sûr s'il y a des pièges à éviter ou si cela est considéré comme bâclé - peut-être qu'il y a une manière plus élégante d'atteindre mes objectifs.

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

Est-ce que quelqu'un a déjà fait cela ? Est-ce que quelqu'un a des conseils ou des astuces sur la façon de procéder ? Quelle serait la façon la plus élégante d'avancer ici ?

83voto

david.s Points 5261

Jetez un œil à la vidéo de ce billet de blog. Elle explique exactement comment utiliser WebAPI avec SignalR.

Essentiellement, l'intégration de Web API + 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. :)

17voto

Filip W Points 13343

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

Si vous n'utilisez pas la version RTM, mais que vous récupérez plutôt une version sur Codeplex, vous verrez qu'il y a un nouveau projet appelé System.Web.Http.SignalR que 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
{
    private static List _items = new List();

    public IEnumerable Get()
    {
        return _items;
    }

    public void Post([FromBody]string item)
    {
        _items.Add(item);
        // Appeler add sur les clients SignalR écoutant le ToDoListHub
        Clients.add(item);
    }
}

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

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

3voto

NinjaCross Points 200

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/

1voto

Paige Cook Points 13415

Découvrez cet exemple de SignalRMvcApiSharedContainer réalisé par Brady Gaster de l'équipe MS/SignalR.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X