Могу ли я использовать как SignalR, так и RESTful API?

116

У меня есть одностраничное веб-приложение, разработанное с использованием ASP.NET. Недавно я преобразовал многие веб-методы в push- режим , используя библиотеку SignalR . Это действительно значительно ускорило страницу и уменьшило количество обращений к серверу со страницы.

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

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

Конечно, бывают ситуации, в которых я хочу, чтобы RESTful WebAPI транслировал события через концентратор SignalR ... Противоположное (SignalR когда-либо нуждалось в доступе к WebAPI) кажется менее вероятным, но я полагаю, что все же возможно.

Кто-нибудь это делал? Есть ли у кого-нибудь советы или подсказки о том, как действовать? Что было бы здесь наиболее элегантным?

mbeasley
источник
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; }
    }
}

Вот и все. :)

david.s
источник
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 Oslo - http://vimeo.com/43603472

Филип В
источник
4
Я сделал это на сервере. Но не могу подключить клиента. Вы знаете, как подключить .NET-клиент к вышеупомянутому серверу?
bytefire
3
Я использую Web API 5.2.3 и SignalR 2.2.1, и этого класса нигде нет. Кто-нибудь знает историю? Это было перед RTM? В конце концов, я просто скопировал определение класса david.s, но мне любопытно, что происходит.
Колин
1
@ 40Alpha - я думаю, мы закончили тем, что у нас просто были статические методы в Hub, которые использовали GlobalHost.ConnectionManager.GetHubContext () (или эквивалент ASP.NET Core), и вызывали эти статические методы из контроллера API.
Colin
3

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

NinjaCross
источник
2
Этот пакет теперь не работает при использовании контрактов кода с приложением веб-API, потому что он требует неуниверсального IHubConnectionContext, который был заменен на IHubConnectionContext<T>. Принятый ответ - лучший вариант.
Деннис
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. Измените свой ответ, чтобы исправить это, а затем отметьте свое сообщение, чтобы запросить отмену удаления
Мэтт,