从 Class 调用时 Signalr 上下文为空

Signalr Context null When Calling from Class

我已经在我的 MVC 5 网站上设置了 Signalr,大部分工作正常。例如,如果我尝试使用 Javascript 发送测试消息 ,效果很好:

$.connection.hub.start().done(function () {
    chat.server.send("Username", "This is a test message");
}); 

我在集线器中的 C# 发送方法发送消息如下:

 public void Send(string username, string message)
 {
     string name = Context.User.Identity.Name;
     Clients.Group(username).getMessages("From: " + name + " - " + message);
 }

当我尝试通过 C# 调用 Send 方法时出现问题,如下所示:

ChatHub ch = new ChatHub();
ch.Send("Username", "This is a test message");

调试时遇到方法,Context对象为null,失败。

本质上,用户在视图中发送一条消息,它点击一个控制器方法,这个方法在一个单独的助手class中调用一个通知方法,这个单独的class调用发送方法我的 Signalr Hub。

我是否需要在控制器中获取上下文,并将其传递给助手 class,然后再传递给集线器?或者有更好的替代方法吗?

谢谢。

更新 我确实设法使用以下方法获取了用户名:

  string name = System.Web.HttpContext.Current.User.Identity.Name;

然而,即使我这样做,它现在在遇到这一行时会抛出异常:

Clients.Group(username).getMessages("From: " + name + " - " + message);

所以我认为仅从 C#(而非 Javascript)调用 Send 时存在上下文问题

所以读到这里发现:

“如果您想从自己在集线器 class 之外运行的代码向客户端发送消息,您无法通过实例化集线器 class 实例来实现,但您可以这样做通过为您的 Hub class."

获取对 SignalR 上下文对象的引用

所以我的解决方案不是这个:

ChatHub ch = new ChatHub();
ch.Send("Username", "This is a test message");

是这样的:

var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
context.Clients.Group(username).getMessages("From: " + name + " - " + message);