从 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);
我已经在我的 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);