mvc 控制器读取信号器值

mvc controller read signalr value

我们目前正在使用 asp.net MVC 和 SignalR 来与浏览器的客户端代码进行通信。

目前我们的中心构建为:

public class SectionHub : Hub
{
}

MVC 控制器获取对它的引用。在一个循环中,当某些步骤完成时,它使用集线器通知客户端:

var progressHub = GlobalHost.ConnectionManager.GetHubContext<SectionHub>();
progressHub.Clients.All.updateCurrentProgress(....)

一切正常。我们现在在客户端添加一个停止按钮,并希望在单击时通知 MVC 控制器停止进程。我们更新了 SectionHub 以包含客户端能够更新的 属性。但是,由于 progressHub 对象是 IHubContext,因此它无法访问 属性。无论如何,是否可以将新的 属性 放入集线器并在 MVC 控制器中访问它,或者将集线器创建为 SectionHub 而不是 IHubContext?

即使您找到在 SectionHub 实例上获取 句柄 的方法,它也无法正常工作,因为这些实例是在 中创建的并在每次请求时丢弃,因此它的值不可靠。

我的建议是,使用您认为最适合的任何方式以 全局 方式访问 属性:静态变量、依赖注入服务、一个数据库记录,一个排队系统。这些都是达到你目标的可靠方法(当然多一些,少一些,这取决于你对容错的要求,以及你试图达到的模块化程度)。

PS:您的代码允许任何人停止向所有人发送通知,这真的是您想要的吗?只是好奇,它可能会对问题本身产生影响。

你不应该在集线器中有那种逻辑,集线器应该只用于推送状态。将所有代码移至后台工作程序,让 MVC 控制器操作直接将工作和 return 排队(Long 运行 控制器操作是一种反模式)。让停止 MVC 控制器操作调用工作队列并告诉它停止工作。

如果你问我,那是一个更可靠的解决方案。

编辑:顺便说一句,我想我的库会对你有所帮助,你可以用它来无缝地将进度状态从你的工作人员推送到你的客户 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki