119

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

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

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

在某些情况下,我希望 RESTful WebAPI 通过 SignalR 集线器广播事件......相反(SignalR 曾经需要访问 WebAPI)似乎不太可能,但我认为仍然可能。

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

4

3 回答 3

89

看看这篇文中的视频。它准确地解释了如何将 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; }
    }
}

就这样。:)

于 2012-09-11T12:26:09.947 回答
18

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 Oslo 上展示的非常相似(更精致,包括测试等) - http://vimeo.com/43603472

于 2012-09-11T12:28:43.770 回答
3

这是显示两种技术集成的视频 http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 这里有一个用于集成的 NuGet 包 https://www.nuget.org/包/Microsoft.AspNet.WebApi.SignalR/

于 2013-10-15T07:31:27.357 回答