Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# mvc控制器读取信号值_C#_Asp.net Mvc_Signalr - Fatal编程技术网

C# mvc控制器读取信号值

C# mvc控制器读取信号值,c#,asp.net-mvc,signalr,C#,Asp.net Mvc,Signalr,我们目前正在使用asp.net MVC和Signal与浏览器的客户端代码进行通信 目前,我们的中心建设为: public class SectionHub : Hub { } MVC控制器获取对它的引用。在循环中,当某些步骤完成时,它使用集线器通知客户端: var progressHub = GlobalHost.ConnectionManager.GetHubContext<SectionHub>(); progressHub.Clients.All.updateCurrentP

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

目前,我们的中心建设为:

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

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

这一切都很好。我们现在在客户机上添加了一个停止按钮,希望在单击该按钮时通知MVC控制器停止该进程。我们更新了SectionHub以包含客户端可以更新的属性。但是,由于progressHub对象是IHubContext,因此它无权访问该属性。是否要将新属性放入中心并在MVC控制器中访问它,或者将中心创建为SectionHub而不是IHubContext?

即使您想办法获取
SectionHub
实例的句柄,它也无法正常工作,因为这些实例是在每次请求时创建和删除的,因此,其价值不可靠

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


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

hub中不应该有这种逻辑,hub应该只用于推送状态。将所有代码移动到后台工作程序,让MVC控制器操作将工作排队并直接返回(长时间运行的控制器操作是一种反模式)。让停止MVC控制器操作调用工作队列,并告诉它停止工作

如果你问我的话,那是一个更为坚实的解决方案

编辑:顺便说一句,我想我的库会对你有所帮助,你可以用它无缝地将进度状态从你的员工推送到你的客户