Posso incorporar SignalR e uma API RESTful?

116

Eu tenho um aplicativo da web de página única desenvolvido usando ASP.NET. Recentemente, converti muitos dos métodos da web para serem baseados em push, usando a biblioteca SignalR . Isso realmente acelerou a página consideravelmente e reduziu muitas das chamadas do servidor da página.

Ao mesmo tempo, também estive olhando para RESTful ASP.NET WebAPI para alguns dos métodos do lado do servidor, com a beleza real de que permite criar uma API para aplicativos externos ao mesmo tempo que desenvolvo o aplicativo principal (que será importante para o que estou fazendo).

Parece, entretanto, depois de ler vários artigos e essas duas perguntas, que os métodos push e WebAPI parecem dois paradigmas totalmente diferentes para a comunicação cliente-servidor. Tenho certeza de que posso criar vários métodos que podem ser acessados ​​por meio de qualquer um dos protocolos, mas não tenho certeza se há armadilhas para isso ou se isso é considerado negligente - talvez haja uma maneira mais elegante de alcançar o que pretendo para.

Certamente há situações em que desejo que o RESTful WebAPI transmita eventos por meio de um hub SignalR ... O oposto (SignalR sempre precisando acessar o WebAPI) parece menos provável, mas suponho que ainda seja possível.

Alguém já fez isso? Alguém tem algum conselho ou dica de como proceder? Qual seria a forma mais elegante de avançar aqui?

mbeasley
fonte
4
Dê uma olhada no vídeo desta postagem do blog . Ele explica exatamente como você pode usar WebAPI com SignalR.
david.s
@ david.s Folheando aquele vídeo, parece perfeito. Poste como a resposta e eu marcarei.
mbeasley

Respostas:

85

Dê uma olhada no vídeo desta postagem do blog . Ele explica exatamente como você pode usar WebAPI com SignalR.

Essencialmente, a integração Web API + SignalR consiste nesta 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; }
    }
}

Isso é tudo. :)

david.s
fonte
43
Para começar a adicionar SignalR à API Web ASP.NET, encaminhe o vídeo para o tempo 33:35.
bytefire
O vídeo não carrega por HTTPS, se você tiver um plugin do navegador para forçar HTTPS, você pode precisar desativá-lo
JMK,
14
@bytefire: na verdade, a integração Web API + SignalR começa a aprox. em 55 min.
Dennis
2
@ davids.s: Eu sei, estou um pouco atrasado, mas obrigado pelo link. Eu adicionei um trecho para outros leitores.
Dennis
1
Não IAppBuilder.MapSignalR ()?
Josh Sutterfield
18

SignalR, na verdade, já está incorporado na fonte WebAPI vNext (4.1).

Se você não usar a compilação RTM, mas em vez disso pegar uma compilação do Codeplex, verá que há um novo projeto chamado System.Web.Http.SignalRque pode ser utilizado. Ele foi adicionado há alguns dias com este commit - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Uso de amostra (conforme mencionado no 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 você não quiser mudar para o vNext por enquanto, pode apenas usar esse código como referência.

Esta implementação é muito semelhante (um pouco mais polida, inclui testes etc.) ao que Brad Wilson mostrou no NDC Oslo - http://vimeo.com/43603472

Filip W
fonte
4
Eu fiz isso no servidor. Mas não consigo conectar o cliente. Você sabe como conectar um cliente .NET com o servidor mencionado acima?
bytefire
3
Estou usando a API Web 5.2.3 e SignalR 2.2.1 e esta classe está longe de ser encontrada. Alguém conhece a história? Foi puxado antes do RTM? Por fim, acabei de copiar a definição de classe de David, mas estou curioso para saber o que está acontecendo.
Colin de
1
@ 40Alpha - Acho que acabamos tendo apenas métodos estáticos no hub que usavam GlobalHost.ConnectionManager.GetHubContext () (ou o equivalente ASP.NET Core) e chamando esses métodos estáticos do controlador de API.
Colin
3

Aqui está um vídeo mostrando uma integração das duas tecnologias http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 e aqui há um pacote NuGet para a integração https://www.nuget.org/ packages / Microsoft.AspNet.WebApi.SignalR /

NinjaCross
fonte
2
Este pacote está quebrado agora, ao usar Contratos de Código com aplicação Web API, porque requer não genérico IHubConnectionContext, que foi substituído por IHubConnectionContext<T>. A resposta aceita é um caminho a percorrer.
Dennis
Embora isso possa teoricamente responder à pergunta, seria preferível incluir as partes essenciais da resposta aqui e fornecer o link para referência. Edite sua resposta para corrigir isso e sinalize sua postagem para solicitar o cancelamento da exclusão
Matt