Czy mogę uwzględnić zarówno SignalR, jak i RESTful API?

116

Mam aplikację internetową z pojedynczą stroną opracowaną przy użyciu programu ASP.NET. Niedawno przekonwertowałem wiele metod internetowych na oparte na wypychaniu przy użyciu biblioteki sygnalizującej . To naprawdę znacznie przyspieszyło działanie strony i zredukowało wiele wywołań serwera ze strony.

W tym samym czasie przyglądałem się również RESTful ASP.NET WebAPI pod kątem niektórych metod po stronie serwera, a prawdziwe piękno polega na tym, że pozwala on tworzyć API dla aplikacji zewnętrznych w tym samym czasie, gdy tworzę podstawowa aplikacja (która będzie ważna dla tego, co robię).

Jednak po zapoznaniu się z kilkoma artykułami i tymi dwoma pytaniami wydaje się, że metody push i WebAPI wydają się być dwoma całkowicie różnymi paradygmatami komunikacji klient-serwer. Jestem pewien, że mogę stworzyć różne metody, do których można uzyskać dostęp za pośrednictwem obu protokołów, ale nie jestem pewien, czy są w tym pułapki lub czy jest to uważane za niedbałe - może istnieje bardziej elegancki sposób na osiągnięcie tego, do czego zmierzam dla.

Z pewnością istnieją sytuacje, w których chcę, aby interfejs RESTful WebAPI emitował zdarzenia za pośrednictwem centrum SignalR ... Wręcz przeciwnie (sygnalizujący kiedykolwiek musi uzyskać dostęp do interfejsu WebAPI) wydaje się mniej prawdopodobne, ale przypuszczam, że nadal jest możliwe.

Czy ktoś to zrobił? Czy ktoś ma jakieś rady lub wskazówki, jak postępować? Jaka byłaby tutaj najbardziej elegancka droga naprzód?

mbeasley
źródło
4
Obejrzyj wideo z tego wpisu na blogu . Wyjaśnia dokładnie, jak można używać interfejsu WebAPI z sygnalizującym.
david.s
@ david.s Przeglądając ten film, wygląda idealnie. Opublikuj to jako odpowiedź, a zaznaczę to.
mbeasley,

Odpowiedzi:

85

Obejrzyj wideo z tego wpisu na blogu . Wyjaśnia dokładnie, jak można używać interfejsu WebAPI z sygnalizującym.

Zasadniczo integracja Web API + SignalR składa się z tej klasy :

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

To wszystko. :)

david.s
źródło
43
Aby przejść bezpośrednio do dodawania SignalR do ASP.NET Web API, przekaż wideo do czasu 33:35.
bytefire
Wideo nie ładuje się przez HTTPS, jeśli masz wtyczkę przeglądarki, która wymusza HTTPS, może być konieczne jej wyłączenie
JMK
14
@bytefire: w rzeczywistości integracja Web API + SignalR rozpoczyna się ok. po 55 min.
Dennis
2
@ davids.s: Wiem, trochę się spóźniłem, ale dzięki za link. Dodałem fragment dla dalszych czytelników.
Dennis
1
Nie ma IAppBuilder.MapSignalR ()?
Josh Sutterfield,
18

SignalR jest już włączony do źródła WebAPI vNext (4,1).

Jeśli nie używasz kompilacji RTM, ale zamiast tego pobierzesz kompilację z Codeplex, zobaczysz, że jest tam nowy projekt o nazwie, System.Web.Http.SignalRktóry możesz wykorzystać. Został dodany kilka dni temu z tym zatwierdzeniem - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Przykładowe użycie (jak wspomniano w zatwierdzeniu):

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

Jeśli nie chcesz na razie przełączać się na vNext, zawsze możesz użyć tego kodu w celach informacyjnych.

Ta implementacja jest bardzo podobna (nieco bardziej dopracowana, zawiera testy itp.) Do tego, co Brad Wilson pokazał na NDC Oslo - http://vimeo.com/43603472

Filip W.
źródło
4
Zrobiłem to na serwerze. Ale nie mogę połączyć klienta. Czy wiesz, jak połączyć klienta .NET z wyżej wymienionym serwerem?
bytefire
3
Używam Web API 5.2.3 i SignalR 2.2.1 i nigdzie nie można znaleźć tej klasy. Czy ktoś zna historię? Czy był szarpany przed RTM? Ostatecznie właśnie skopiowałem definicję klasy Dawida, ale jestem ciekawy, co się dzieje.
Colin,
1
@ 40Alpha - myślę, że skończyliśmy po prostu mając statyczne metody w centrum, które używają GlobalHost.ConnectionManager.GetHubContext () (lub odpowiednik ASP.NET Core) i wywołując te statyczne metody z kontrolera API.
Colin
3

Tutaj jest film pokazujący integrację dwóch technologii http://channel9.msdn.com/Events/TechDays/Belgium-2013/25, a tutaj jest pakiet NuGet do integracji https://www.nuget.org/ pakiety / Microsoft.AspNet.WebApi.SignalR /

NinjaCross
źródło
2
Ten pakiet jest teraz zepsuty podczas korzystania z kontraktów kodu z aplikacją Web API, ponieważ wymaga nieogólnego IHubConnectionContext, który został zastąpiony przez IHubConnectionContext<T>. Zaakceptowana odpowiedź jest drogą do zrobienia.
Dennis
Chociaż może to teoretycznie odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Edytuj swoją odpowiedź, aby to poprawić, a następnie oflaguj swój post, aby poprosić o usunięcie
Matt