Могу ли я включить как 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/

Другие вопросы по тегам