Чи можу я включати як SignalR, так і API RESTful?


116

У мене є веб-додаток на одній сторінці, розроблений за допомогою ASP.NET. Нещодавно я перетворив багато веб-методів на основі "push", використовуючи бібліотеку SignalR . Це дійсно значно прискорило сторінку та зменшило багато серверних дзвінків зі сторінки.

У той же час я також розглядав RESTful ASP.NET WebAPI для деяких методів на стороні сервера, справжня краса полягає в тому, що він дозволяє створювати API для зовнішніх програм одночасно, коли я розробляю основний додаток (що буде важливо для того, що я роблю).

Однак, після перегляду кількох статей і цих двох питань, методи push і WebAPI здаються двома абсолютно різними парадигмами для спілкування клієнт-сервер. Я впевнений, що я можу створити різні методи, доступ до яких можна отримати за допомогою будь-якого протоколу, але я не впевнений, чи є в цьому підводні камені або якщо це вважається неохайним - можливо, є більш елегантний спосіб досягти того, що я прагну для.

Звичайно, є ситуації, в яких я хочу, щоб RESTful WebAPI транслював події через концентратор SignalR ... Навпаки (SignalR коли-небудь потребує доступу до WebAPI) здається менш імовірним, але я вважаю, що все-таки можливо.

Хтось робив це? Хтось має поради чи поради щодо того, як діяти? Який би тут був найелегантніший шлях?


4
Погляньте на відео з цієї публікації в блозі . Це точно пояснює, як можна використовувати WebAPI з SignalR.
david.s

@ david.s Скімінг через цей вид, це виглядає ідеально. Опублікуйте це як відповідь, і я позначу це.
mbeasley

Відповіді:


85

Погляньте на відео з цієї публікації в блозі . Це точно пояснює, як можна використовувати WebAPI з SignalR.

По суті, інтеграція Web API + SignalR складається з цього класу :

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

Це все. :)


43
Щоб перейти до додавання SignalR до веб-API ASP.NET, перешліть це відео в 33:35.
bytefire

Відео не завантажується через HTTPS, якщо у вас є плагін браузера, щоб змусити HTTPS вам може знадобитися його відключити
JMK

14
@bytefire: насправді інтеграція Web API + SignalR починається приблизно. за 55 хв.
Денніс

2
@ davids.s: Я знаю, що я трохи спізнююсь, але дякую за посилання. Я додав уривок для подальших читачів.
Денніс

1
Немає IAppBuilder.MapSignalR ()?
Джош Саттерфілд

18

SignalR насправді вже включений у джерело WebAPI vNext (4.1).

Якщо ви використовуєте не збірку RTM, а замість цього захопите Codeplex, ви побачите, що існує новий проект, System.Web.Http.SignalRякий називається, який ви можете використовувати. Він був доданий пару днів тому цим комітетом - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Використання зразка (як зазначено в комісії):

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

Якщо ви зараз не хочете переходити до vNext, ви завжди можете просто використовувати цей код для довідки.

Ця реалізація дуже схожа (трохи більш відполірована, включає тести тощо), як показала Бред Вілсон у NDC Осло - http://vimeo.com/43603472


4
Я це робив на сервері. Але не вдається підключити клієнта. Чи знаєте ви, як з'єднати клієнт .NET із вищезгаданим сервером?
bytefire

3
Я використовую Web API 5.2.3 та SignalR 2.2.1, і цього класу ніде не можна знайти. Хтось знає історію? Чи тикав до RTM? Зрештою, я просто скопіював визначення класу david.s, але мені цікаво, що відбувається.
Колін

1
@ 40Alpha - Я думаю, що ми закінчилися просто статичними методами на концентраторі, що використовував GlobalHost.ConnectionManager.GetHubContext () (або еквівалент ASP.NET Core), і викликав ці статичні методи з контролера API.
Колін

3

Ось відео, що демонструє інтеграцію двох технологій http://channel9.msdn.com/Events/TechDays/Belgium-2013/25, і тут є пакет NuGet для інтеграції https://www.nuget.org/ пакети / Microsoft.AspNet.WebApi.SignalR /


2
Цей пакет порушено зараз при використанні кодових контрактів із додатком Web API, тому що він вимагає не загальних IHubConnectionContext, які були замінені на IHubConnectionContext<T>. Прийнята відповідь - це шлях.
Денніс

Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки. Будь ласка, відредагуйте свою відповідь, щоб виправити це, а потім позначте свою публікацію, щоб вимагати видалення
Метт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.