¿Puedo incorporar SignalR y una API RESTful?

116

Tengo una aplicación web de una sola página desarrollada con ASP.NET. Recientemente, convertí muchos de los métodos web para que se basaran en push, utilizando la biblioteca SignalR . Esto realmente aceleró considerablemente la página y redujo muchas de las llamadas al servidor desde la página.

Al mismo tiempo, también he estado buscando en RESTful ASP.NET WebAPI para algunos de los métodos del lado del servidor, con la verdadera belleza de que permite crear una API para aplicaciones externas al mismo tiempo que desarrollo el aplicación principal (que será importante para lo que estoy haciendo).

Sin embargo, parece, después de mirar varios artículos y estas dos preguntas, que los métodos push y WebAPI parecen dos paradigmas completamente diferentes para la comunicación cliente-servidor. Estoy seguro de que puedo crear varios métodos a los que se puede acceder a través de cualquiera de los protocolos, pero no estoy seguro de si esto tiene dificultades o si se considera descuidado; tal vez haya una forma más elegante de lograr lo que pretendo. para.

Ciertamente, hay situaciones en las que quiero que RESTful WebAPI transmita eventos a través de un concentrador de SignalR ... Lo contrario (SignalR necesita acceder a WebAPI) parece menos probable, pero supongo que aún es posible.

¿Alguien ha hecho esto? ¿Alguien tiene algún consejo o sugerencia sobre cómo proceder? ¿Cuál sería la forma más elegante de avanzar aquí?

mbeasley
fuente
4
Eche un vistazo al video de esta publicación de blog . Explica exactamente cómo puede usar WebAPI con SignalR.
david.s
@ david.s Hojeando ese video, se ve perfecto. Publícalo como respuesta y lo marcaré.
mbeasley

Respuestas:

85

Eche un vistazo al video de esta publicación de blog . Explica exactamente cómo puede usar WebAPI con SignalR.

Básicamente, la integración Web API + SignalR consiste en esta clase :

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; }
    }
}

Eso es todo. :)

david.s
fuente
43
Para comenzar directamente a agregar SignalR a ASP.NET Web API, reenvíe el video a la hora 33:35.
bytefire
El video no se carga a través de HTTPS, si tiene un complemento de navegador para forzar HTTPS, es posible que deba deshabilitarlo
JMK
14
@bytefire: en realidad, la integración de Web API + SignalR comienza aprox. a los 55 min.
Dennis
2
@ davids.s: Lo sé, llego un poco tarde, pero gracias por el enlace. Agregué un extracto para más lectores.
Dennis
1
¿No hay IAppBuilder.MapSignalR ()?
Josh Sutterfield
18

SignalR ya está incorporado en la fuente WebAPI vNext (4.1).

Si no usa la compilación RTM, sino que toma una compilación de Codeplex, verá que hay un nuevo proyecto llamado System.Web.Http.SignalRque puede utilizar. Se agregó hace un par de días con este compromiso: http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Uso de muestra (como se menciona en el compromiso):

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 no desea cambiar a vNext por ahora, siempre puede usar ese código como referencia.

Esta implementación es muy similar (un poco más pulida, incluye pruebas, etc.) a lo que Brad Wilson mostró en NDC Oslo - http://vimeo.com/43603472

Filip W
fuente
4
Lo hice en el servidor. Pero no se puede conectar al cliente. ¿Sabe cómo conectar un cliente .NET con el servidor mencionado anteriormente?
Bytefire
3
Estoy usando Web API 5.2.3 y SignalR 2.2.1 y esta clase no se encuentra en ninguna parte. ¿Alguien conoce la historia? ¿Fue tirado antes de RTM? Al final, solo copié la definición de clase de david.s, pero tengo curiosidad por saber qué está pasando.
Colin
1
@ 40Alpha: creo que terminamos teniendo métodos estáticos en el Hub que usaban GlobalHost.ConnectionManager.GetHubContext () (o el equivalente de ASP.NET Core) y llamando a esos métodos estáticos desde el controlador de API.
Colin
3

Aquí hay un video que muestra una integración de las dos tecnologías http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 y aquí hay un paquete NuGet para la integración https://www.nuget.org/ paquetes / Microsoft.AspNet.WebApi.SignalR /

NinjaCross
fuente
2
Este paquete está roto ahora, cuando se utilizan contratos de código con la aplicación Web API, porque requiere no genérico IHubConnectionContext, que fue reemplazado por IHubConnectionContext<T>. La respuesta aceptada es un camino a seguir.
Dennis
Si bien esto puede responder teóricamente a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Edite su respuesta para corregir esto, luego marque su publicación para solicitar que se elimine
Matt