【问题标题】:mvc controller read signalr valuemvc 控制器读取信号器值
【发布时间】:2015-04-22 13:31:33
【问题描述】:

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

目前我们的中心是这样构建的:

public class SectionHub : Hub
{
}

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

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

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

【问题讨论】:

    标签: c# asp.net-mvc signalr


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多