我可以同时合并 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<T>
取代。接受的答案是一种方法。
虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。请编辑您的答案以更正此问题,然后标记您的帖子以请求取消删除以上是关于我可以同时合并 SignalR 和 RESTful API 吗?的主要内容,如果未能解决你的问题,请参考以下文章
.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容
如何测试托管在Azure Appservice上的SignalR应用(负载+功能结合)?
.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容