Kann ich sowohl SignalR als auch eine RESTful-API integrieren?

116

Ich habe eine einseitige Web-App, die mit ASP.NET entwickelt wurde. Ich habe kürzlich viele der Webmethoden mithilfe der SignalR- Bibliothek auf Push-basiert konvertiert . Dies hat die Seite erheblich beschleunigt und viele Serveraufrufe von der Seite reduziert.

Gleichzeitig habe ich mir die RESTful ASP.NET-WebAPI für einige der serverseitigen Methoden angesehen. Das Schöne daran ist, dass sie gleichzeitig mit der Entwicklung der API eine API für externe Anwendungen erstellen kann Kernanwendung (die für das, was ich tue, wichtig sein wird).

Nach dem Betrachten mehrerer Artikel und dieser beiden Fragen scheinen Push- und WebAPI-Methoden jedoch zwei völlig unterschiedliche Paradigmen für die Client-Server-Kommunikation zu sein. Ich bin sicher, dass ich verschiedene Methoden erstellen kann, auf die über beide Protokolle zugegriffen werden kann, aber ich bin mir nicht sicher, ob dies Fallstricke aufweist oder ob dies als schlampig angesehen wird - vielleicht gibt es einen eleganteren Weg, um das zu erreichen, was ich anstrebe zum.

Es gibt sicherlich Situationen, in denen ich möchte, dass die RESTful-WebAPI Ereignisse über einen SignalR-Hub sendet ... Das Gegenteil (SignalR muss jemals auf die WebAPI zugreifen) scheint weniger wahrscheinlich, aber ich nehme an, dass dies immer noch möglich ist.

Hat jemand das getan? Hat jemand Ratschläge oder Tipps zum weiteren Vorgehen? Was wäre hier der eleganteste Weg nach vorne?

mbeasley
quelle
4
Schauen Sie sich das Video aus diesem Blog-Beitrag an . Es wird genau erklärt, wie Sie WebAPI mit SignalR verwenden können.
David.s
@ david.s Beim Durchblättern dieses Videos sieht es perfekt aus. Poste es als Antwort und ich werde es markieren.
mbeasley

Antworten:

85

Schauen Sie sich das Video aus diesem Blog-Beitrag an . Es wird genau erklärt, wie Sie WebAPI mit SignalR verwenden können.

Die Integration von Web API + SignalR besteht im Wesentlichen aus dieser Klasse :

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

Das ist alles. :) :)

david.s
quelle
43
Leiten Sie das Video an die Zeit 33:35 weiter, um SignalR direkt zur ASP.NET-Web-API hinzuzufügen.
Bytefire
Das Video wird nicht über HTTPS geladen. Wenn Sie ein Browser-Plugin haben, um HTTPS zu erzwingen, müssen Sie es möglicherweise deaktivieren
JMK
14
@bytefire: Tatsächlich beginnt die Integration von Web API + SignalR ca. bei 55 min.
Dennis
2
@ davids.s: Ich weiß, dass ich etwas spät dran bin, aber danke für den Link. Ich habe einen Auszug für weitere Leser hinzugefügt.
Dennis
1
Nein IAppBuilder.MapSignalR ()?
Josh Sutterfield
18

SignalR ist tatsächlich bereits in der WebAPI-Quelle vNext (4.1) enthalten.

Wenn Sie nicht den RTM-Build verwenden, sondern stattdessen einen Build aus Codeplex verwenden, sehen Sie, dass dort ein neues Projekt namens heißt, System.Web.Http.SignalRdas Sie verwenden können. Es wurde vor ein paar Tagen mit diesem Commit hinzugefügt - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Beispielnutzung (wie im Commit erwähnt):

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

Wenn Sie vorerst nicht zu vNext wechseln möchten, können Sie diesen Code immer nur als Referenz verwenden.

Diese Implementierung ist sehr ähnlich (etwas ausgefeilter, enthält Tests usw.) dem, was Brad Wilson auf der NDC Oslo gezeigt hat - http://vimeo.com/43603472

Filip W.
quelle
4
Ich habe das auf dem Server gemacht. Client kann jedoch nicht verbunden werden. Wissen Sie, wie Sie einen .NET-Client mit dem oben genannten Server verbinden?
Bytefire
3
Ich verwende Web API 5.2.3 und SignalR 2.2.1 und diese Klasse ist nirgends zu finden. Kennt jemand die Geschichte? Wurde es vor RTM gerissen? Letztendlich habe ich nur die Klassendefinition von david.s kopiert, aber ich bin gespannt, was los ist.
Colin
1
@ 40Alpha - Ich denke, wir hatten nur statische Methoden im Hub, die GlobalHost.ConnectionManager.GetHubContext () (oder das ASP.NET Core-Äquivalent) verwendeten, und haben diese statischen Methoden vom API-Controller aufgerufen.
Colin
3

Hier ist ein Video, das eine Integration der beiden Technologien zeigt http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 und hier gibt es ein NuGet-Paket für die Integration https://www.nuget.org/ packages / Microsoft.AspNet.WebApi.SignalR /

NinjaCross
quelle
2
Dieses Paket ist jetzt bei Verwendung von Codeverträgen mit einer Web-API-Anwendung fehlerhaft, da es nicht generische Elemente erfordert IHubConnectionContext, die durch ersetzt wurden IHubConnectionContext<T>. Akzeptierte Antwort ist ein langer Weg.
Dennis
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Bitte bearbeiten Sie Ihre Antwort, um dies zu korrigieren, und markieren Sie dann Ihren Beitrag, um das Löschen zu beantragen
Matt