Signalr Context null当从类调用时



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

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

我在Hub中的c# send方法发送这样的消息:

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对象为空并且失败。

从本质上讲,用户在视图中发送一条消息,它击中一个控制器方法,这个方法调用通知方法在一个单独的助手类,这单独的类调用Send方法Signalr中心。

我是否需要在控制器中获取上下文,并将其传递给助手类,然后传递给Hub?还是有更好的替代方法?

谢谢。

我确实设法使用:

获得用户名
string name = System.Web.HttpContext.Current.User.Identity.Name;

但是,即使我这样做了,现在当它到达这一行时,它会抛出一个异常:

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

所以我认为只有从c#调用Send(不是从Javascript)时存在上下文问题

所以从阅读这个结果来看:https://stackoverflow.com/a/36988086/4181058

如果您想从运行在Hub类之外的自己的代码向客户端发送消息,您不能通过实例化Hub类实例来实现,但是您可以通过获取Hub类的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);

相关内容

最新更新