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