web-dev-qa-db-fra.com

Puis-je incorporer à la fois SignalR et une API RESTful?

J'ai une application Web d'une seule page développée avec ASP.NET. J'ai récemment converti de nombreuses méthodes Web en Push, à l'aide de la bibliothèque SignalR . Cela accéléra considérablement la page et réduisit beaucoup d'appels du serveur à partir de la page.

En même temps, je me suis également penché sur l’API WebAPI RESTful ASP.NET pour certaines des méthodes côté serveur, avec l’avantage réel de pouvoir créer une API pour des applications externes tout en développant le application de base (ce qui sera important pour ce que je fais).

Il semble cependant, après avoir examiné plusieurs articles et ceux-cideux questions, que les méthodes Push et WebAPI apparaissent comme deux paradigmes totalement différents pour la communication client-serveur. Je suis sûr que je peux créer différentes méthodes accessibles via l'un ou l'autre protocole, mais je ne suis pas sûr s'il y a des pièges à cela ou si cela est considéré comme négligeable - peut-être qu'il y a une manière plus élégante de réaliser ce que je vise pour.

Il existe certainement des situations dans lesquelles je souhaite que RESTful WebAPI diffuse des événements via un concentrateur SignalR ... L’inverse (SignalR ayant toujours besoin d’accéder à WebAPI) semble moins probable, mais je suppose que cela est toujours possible.

Est-ce que quelqu'un a fait ça? Quelqu'un at-il des conseils ou des astuces sur la façon de procéder? Quelle serait la voie la plus élégante à suivre ici?

107
mbeasley

Regardez la vidéo de cette article de blog . Il explique exactement comment utiliser WebAPI avec SignalR.

L’intégration de l’API Web + SignalR consiste essentiellement en ceci 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. :)

83
david.s

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

Si vous n'utilisez pas la version RTM, mais récupérez 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<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 utiliser ce code pour référence.

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

15
Filip W

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

2
NinjaCross