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