我可以同时合并 SignalR 和 RESTful API 吗?

我有一个单页网页应用程序开发使用 ASP.NET。我最近使用 信号 R库将许多 Web 方法转换为基于推的方法。这确实大大加快了页面的速度,并减少了来自页面的大量服务器调用。

与此同时,我也一直在研究一些服务器端方法的 RESTful ASP.NET WebAPI,真正的美妙之处在于,它允许我在开发核心应用程序的同时为外部应用程序创建 API (这对我正在做的事情很重要)。

然而,在查看了几篇文章和 这些 问题之后,push 和 WebAPI 方法似乎是客户机-服务器通信的两种完全不同的范例。我确信我可以创建各种各样的方法,可以通过任何一种协议访问,但我不确定这是否有陷阱,或者这是否被认为是草率的——也许有一个更优雅的方式来实现我的目标。

There are certainly situations in which I want the RESTful WebAPI to broadcast events via a SignalR hub... The opposite (SignalR ever needing to access the WebAPI) seems less likely, but I suppose still possible.

Has anyone done this? Does anyone have any advice or tips on how to proceed? What would be the most elegant way forward here?

72774 次浏览

看看这个 博客文章的视频,它解释了如何使用带 SignalR 的 WebAPI。

本质上,Web API + SignalR 集成包含在这个 class中:

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 构建,而是使用了一个来自 Codebx 的构建,那么您将看到一个名为 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 Oslo-http://vimeo.com/43603472上展示的非常相似(更精致一些,包括测试等)

下面的视频展示了这两种技术的结合 Http://channel9.msdn.com/events/techdays/belgium-2013/25 这里有一个用于集成的 NuGet 软件包 Https://www.nuget.org/packages/microsoft ,AspNet,WebApi,SignalR/