我可以合并SignalR和RESTful API吗?

我有一个使用ASP.NET开发的单页网页应用程序。 最近,我使用SignalR库将许多web方法转换为基于push的方法。 这确实大大加快了页面,减less了页面上的大量服务器调用。

同时,我也一直在寻找一些服务器端方法的RESTful ASP.NET WebAPI,真正的美妙之处在于它允许在开发的同时为外部应用程序创build一个API核心应用程序(这将是我所做的重要)。

然而,在看了几篇文章和这 两个问题之后,似乎推送和WebAPI方法似乎是客户机 – 服务器通信的两种完全不同的范例。 我敢肯定,我可以创build各种方法,可以通过任何协议访问,但我不确定是否有这个陷阱或如果这被认为是马虎 – 也许有一个更优雅的方式来实现我的目标对于。

当然,我希望RESTful WebAPI通过SignalR集线器广播事件。相反(SignalR需要访问WebAPI)看起来不太可能,但我想还是有可能的。

有没有人做过这个? 有没有人有任何build议或提示如何进行? 这里最优雅的方式是什么?

看看这个博客文章的video。 它解释了如何使用SignalR的WebAPI。

本质上,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,您可以随时使用该代码作为参考。

这个实现和Brad Wilson在NDC奥斯陆展示的东西非常相似(更精美些,包括testing等) – http://vimeo.com/43603472