【问题标题】:SignalR version 1.2.2 client side method not being called, nor is console logging being made未调用 SignalR 版本 1.2.2 客户端方法,也未进行控制台日志记录
【发布时间】:2026-01-07 08:05:02
【问题描述】:

我正在使用本教程:https://docs.microsoft.com/en-us/aspnet/signalr/overview/older-versions/tutorial-server-broadcast-with-aspnet-signalr 广播来自 Conext 存储在单例中的消息。我有几个问题。

首先,分配集线器并从客户端建立连接似乎没有任何问题。这是我的代码:

  $(function () {
      var transactionHub = $.connection.TransactPtHub; // the generated client-side hub proxy

      transactionHub.client.broadcastDmrUpdate = function (test) {

          alert("Yo-Yo Ma!!" + test);
      };
      console.log('test');
      $.connection.hub.logging = true;
      $.connection.hub.start()
          .done(function () { console.log('Now connected, connection ID=' + $.connection.hub.id); })
          .fail(function () { console.log('Could not Connect!'); });

      if ($.connection.hub.state === $.signalR.connectionState.disconnected) {
          alert("connected");
      }
      else {
          alert("not connected");
      }

  });

我的警报“已连接”确实会在页面加载时显示。这部分代码中的函数“transactionHub.client.broadcastDmrUpdate = function (test) {...”永远不会从服务器端调用。

这是我的单身:

public class TransactPtSingleton
{
    private readonly static Lazy<TransactPtSingleton> _instance = new Lazy<TransactPtSingleton>(() => new TransactPtSingleton(GlobalHost.ConnectionManager.GetHubContext<TransactPtHub>().Clients));

    private TransactPtSingleton(IHubConnectionContext clients)
    {
        Clients = clients;
    }

    private IHubConnectionContext Clients
    {
        get;
        set;
    }

    public static TransactPtSingleton Instance
    {
        get
        {
            return _instance.Value;
        }
    }

    public void BroadcastDmrUpdate(string dmr)
    {
        Clients.All.broadcastDmrUpdate(dmr);
    }  
}

这是我的中心,

[HubName("TransactPtHub")]
public class TransactPtHub : Hub
{
    public void UpdateDailyTransactionTable()
    {

    }
}

所以,我在广播时没有收到对客户端函数的回调,即使我将日志记录设置为 true,我也没有在浏览器控制台中看到任何日志。我从哪里开始排除故障?或者我做错了什么?谢谢。

更新:我误读了自己的诊断结果。
if ($.connection.hub.state === $.signalR.connectionState.disconnected) {

正在触发,所以连接由于某种原因没有启动。此外,.done 和 .fail 永远不会被输入,我也永远不会收到任何控制台消息。

更新2:通过SignalR.js梳理一下好像有关系,

        // Check to see if start is being called prior to page load
        // If waitForPageLoad is true we then want to re-direct function call to the window load event
        if (!_pageLoaded && config.waitForPageLoad === true) {
            connection._.deferredStartHandler = function () {
                connection.start(options, callback);
            };
            _pageWindow.bind("load", connection._.deferredStartHandler);

            return deferred.promise();
        }

在 return deferred.promise() 时,它会离开 SignalR.js 并返回 UI 中的调用脚本。

【问题讨论】:

  • JS 好像没问题。能否设置断点并验证您的 C# 方法 BroadcastDmrUpdate 方法是否被调用?
  • @FrankModica 是的,我忘了提。我已经设置了断点,它正在点击该方法并调用 Clients.All.broadcastDmrUpdate(dmr);但后来我没有得到客户端的响应或活动。
  • 你有RouteTable.Routes.MapHubs();?
  • @FrankModica 是的,我先调用它,protected void Application_Start() { RouteTable.Routes.MapHubs(); 我也在声明 Ninject,DependencyResolver.SetResolver(new NinjectDependencyResolver()); 认为这可能与它有关,我将其注释掉,仍然是相同的行为。跨度>
  • 我使用的是jquery 3.1.1版

标签: c# asp.net-mvc-4 signalr


【解决方案1】:

想通了。所以这基本上可以追溯到我原来的问题:Question 最初源于将 SignalR 1.2.2 与 JQuery 版本 3 一起使用

来自我的“更新 2”

 if (!_pageLoaded && config.waitForPageLoad === true) {....

这是有问题的,因为在 Jquery > 3 中弃用了 .load 我需要按照以下方式将 .load 更改为 .on:

重大更改:.load()、.unload() 和 .error() 已删除

这些方法是事件操作的快捷方式,但有一些 API 限制。事件 .load() 方法与 ajax .load() 方法冲突。由于 DOM 方法的定义方式,.error() 方法不能与 window.onerror 一起使用。如果您需要通过这些名称附加事件,请使用 .on() 方法,例如将 $("img").load(fn) 更改为 $("img").on("load", fn)。

发件人:JQuery Guide

但我在 jquery.signalR-1.2.2js 内部搞砸了,而不是改变,

_pageWindow.load(function () { _pageLoaded = true; });

_pageWindow.on("load", function () { _pageLoaded = true; });  

我做到了,

_pageWindow.on(function () { _pageLoaded = true; });

没有显示任何控制台错误,这让事情变得更加困难。但是,现在从客户端建立 SignalR 连接,并且 SignalR 日志记录现在正在工作。

因此,如果您使用旧版本的 SignalR 和新版本的 JQuery,这可能是您的问题和解决方案。

【讨论】:

  • 感谢您发布解决方案!
最近更新 更多