Czy Mogę włączyć zarówno SignalR, jak i RESTful API?

Mam jednostronicową aplikację internetową opracowaną przy użyciu ASP.NET. niedawno przekonwertowałem wiele metod internetowych na push, używając biblioteki SignalR . To naprawdę znacznie przyspieszyło stronę i zmniejszyło wiele wywołań serwera ze strony.

W tym samym czasie, I ' ve been looking at the RESTful ASP.NET WebAPI dla niektórych metod po stronie serwera, z prawdziwym pięknem jest to, że pozwala na tworzenie API dla zewnętrznych aplikacji w tym samym czasie, który rozwijam core aplikacji (co będzie ważne dla tego, co robię).

Wydaje się jednak, po przejrzeniu kilku artykułów i Te dwa pytania, które metody push i WebAPI wydają się zupełnie odmiennymi paradygmatami komunikacji klient-serwer. Jestem pewien, że mogę tworzyć 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 , czy jest to uważane za niechlujne -- może jest bardziej elegancki sposób na osiągnięcie do czego zmierzam.

Są z pewnością sytuacje, w których chcę, aby RESTful WebAPI transmitowało wydarzenia za pośrednictwem SignalR hub... Odwrotnie (SignalR kiedykolwiek potrzebujących dostępu do WebAPI) wydaje się mniej prawdopodobne, ale przypuszczam, że nadal możliwe.

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

Author: Community, 2012-09-11

3 answers

Spójrz na wideo z tego blogu . Wyjaśnia dokładnie, w jaki sposób można używać WebAPI z SignalR.

Zasadniczo Integracja Web API + SignalR składa się z 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. :)
 77
Author: david.s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-21 07:15:50

SignalR jest już wbudowany w WebAPI source vNext (4.1).

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

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

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 na razie nie chcesz przełączyć się na vNext, możesz Zawsze używaj tego kodu w celach informacyjnych.

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

 14
Author: Filip W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-12 19:47:33

Oto film pokazujący integrację obu technologii http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 a tutaj jest pakiet NuGet do integracji https://www.nuget.org/packages/Microsoft.AspNet.WebApi.SignalR/

 1
Author: NinjaCross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 08:28:10