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

Posted

技术标签:

【中文标题】我可以同时合并 SignalR 和 RESTful API 吗?【英文标题】:Can I incorporate both SignalR and a RESTful API? 【发布时间】:2012-09-04 07:54:48 【问题描述】:

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

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

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

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

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

【问题讨论】:

看看这个blog post的视频。它准确地解释了如何将 WebAPI 与 SignalR 一起使用。 @david.s 浏览该视频,它看起来很完美。将其发布为答案,我会标记它。 【参考方案1】:

观看来自此blog post 的视频。它准确地解释了如何将 WebAPI 与 SignalR 一起使用。

本质上,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 添加到 ASP.NET Web API,请将视频转发到时间 33:35。 视频无法通过 HTTPS 加载,如果您有浏览器插件强制使用 HTTPS,您可能需要禁用它 @bytefire:实际上,Web API + SignalR 集成大约开始。 55 分钟。 @davids.s:我知道,我来晚了,但感谢您的链接。我为更多读者添加了摘录。 没有 IAppBuilder.MapSignalR()?【参考方案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,您可以随时使用该代码作为参考。

此实现与 Brad Wilson 在奥斯陆 NDC 展示的内容非常相似(更精致一些,包括测试等) - http://vimeo.com/43603472

【讨论】:

我已经在服务器上完成了。但无法连接客户端。您知道如何将 .NET 客户端与上述服务器连接吗? 我正在使用 Web API 5.2.3 和 SignalR 2.2.1,但找不到此类。有谁知道历史吗?在 RTM 之前被拉过吗?最终,我只是复制了 david.s 的类定义,但我很好奇发生了什么。 @40Alpha - 我认为我们最终只是在 Hub 中使用了使用 GlobalHost.ConnectionManager.GetHubContext()(或 ASP.NET Core 等效项)的静态方法,并从 API 调用这些静态方法控制器。【参考方案3】:

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

【讨论】:

这个包现在被破坏了,当使用带有 Web API 应用程序的代码协定时,因为它需要非泛型 IHubConnectionContext,它已被 IHubConnectionContext&lt;T&gt; 取代。接受的答案是一种方法。 虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。请编辑您的答案以更正此问题,然后标记您的帖子以请求取消删除

以上是关于我可以同时合并 SignalR 和 RESTful API 吗?的主要内容,如果未能解决你的问题,请参考以下文章

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容

如何测试托管在Azure Appservice上的SignalR应用(负载+功能结合)?

在后台主机中托管SignalR服务并广播心跳包

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容

JPA 在带有 DTO 和乐观锁定的 RESTful Web 应用程序中合并?

无法使用 SignalR 在 safari ipad/iphone 上的同一 Web 应用程序中同时打开 2 个选项卡