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

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

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

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

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

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

Ответ 1

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

Это все.:)

Ответ 2

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