Могу ли я включить SignalR и RESTful API?

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

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

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

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

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

3 ответов


взгляните на видео из этого блоге. Это объясняет, как именно вы можете использовать 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; }
    }
}

вот и все. :)


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


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