C# ASP.NET MVC中使用SignalR Hub和Controller类的正确方法

C# ASP.NET MVC中使用SignalR Hub和Controller类的正确方法,c#,asp.net-mvc,asp.net-mvc-4,signalr,signalr-hub,C#,Asp.net Mvc,Asp.net Mvc 4,Signalr,Signalr Hub,我尝试将从webservice调用接收到的数据发送到javascript客户端。 正确的方法是什么?我应该在控制器类中创建hubContext吗 //Controller var data = this.getData(_Ids); var hubContext = GlobalHost.ConnectionManager.GetHubContext<Hubs.MyHub>(); hubContext.Clients.Client(cc.ConnectionId).receiveD

我尝试将从webservice调用接收到的数据发送到javascript客户端。 正确的方法是什么?我应该在控制器类中创建hubContext吗

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

您永远不应该实例化一个与当前执行上下文分离的控制器,将模拟小异常作为单元测试的一部分

结构如下:

var data = new MyController().getData(_Ids);
最好避免。如果从这两个方面做出决定,则最好从控制器获取集线器上下文

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

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


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

谢谢您的回答。我尝试了静态适配器帮助器,但在本例中,我的身份验证令牌有问题。所以我使用第一种方法。
var data = new MyController().getData(_Ids);