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