【问题标题】:correct approach with SignalR Hub and Controller class in ASP.NET MVC在 ASP.NET MVC 中使用 SignalR Hub 和 Controller 类的正确方法
【发布时间】:2018-06-03 05:54:14
【问题描述】:

我尝试将接收到的来自 web 服务调用的数据发送到我的 javascript 客户端。 什么是正确的方法?我应该在 Controller 类中创建一个 hubContext

//Controller 
var data = this.getData(_Ids);
var hubContext = GlobalHost.ConnectionManager.GetHubContext<Hubs.MyHub>();
hubContext.Clients.Client(cc.ConnectionId).receiveData(data);

并以这种方式发送接收到的数据。 或者我应该在 Hub 类中创建一个控制器来获取那里的数据并在 Hub 中发送它

//SignalR Hub
var data = new MyController().getData(_Ids);
Clients.Client(cpm.ConnectionId).receiveData(data);

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 signalr signalr-hub


    【解决方案1】:

    你不应该实例化一个从当前执行上下文中分离出来的控制器,作为单元测试的一部分被模拟的小异常。

    结构如下:

    var data = new MyController().getData(_Ids);
    

    最好避免。如果从两者中决定最好从控制器获取集线器上下文。

    但是,您的示例不完整,因为您没有显示 getData(_Ids) 方法内部的内容,而是说您从 Web 服务获取数据?

    也许您可以将检索逻辑,即 getData(_Ids) 封装在 Hub 本身的 receiveData() 中,或者如果您在更多地方调用此服务,您还可以定义一个静态适配器帮助器类,它将围绕调用到 web 服务,这个适配器以后可以在集线器的 receiveData() 方法中使用。

    请注意,根据您编写的应用程序、其范围和功能,使用 Autofac 或 Ninject 等一些依赖注入框架并通过构造函数将 IConnectionManager 注入控制器而不是在方法中实例化它可能是一个好主意。

    【讨论】:

    • 感谢您的回答。我尝试了静态适配器助手,但在这种情况下,我的身份验证令牌有问题。所以我使用第一种方法。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2011-10-24
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2020-09-12
    相关资源
    最近更新 更多