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