【问题标题】:Signalr Context null When Calling from Class从类调用时 Signalr Context null
【发布时间】:2021-11-30 11:17:04
【问题描述】:

我已经在我的 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对象为null,失败。

本质上,用户在 View 中发送消息,它点击一个控制器方法,该方法调用一个单独的帮助类中的通知方法,这个单独的类调用我的 Signalr Hub 的 Send 方法。

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

谢谢。

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

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

但是,即使我这样做了,它现在在遇到这一行时也会引发异常:

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

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

【问题讨论】:

    标签: asp.net-mvc-5 signalr


    【解决方案1】:

    从阅读中可以看出:https://stackoverflow.com/a/36988086/4181058

    “如果你想从你自己的在 Hub 类之外运行的代码向客户端发送消息,你不能通过实例化一个 Hub 类实例来做到这一点,但你可以通过获取对 SignalR 上下文对象的引用来做到这一点为您的 Hub 课程。”

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

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2016-05-21
      • 2019-11-10
      • 2018-02-22
      相关资源
      最近更新 更多