SignalR版本1.2.2客户端方法未被调用,也没有进行控制台日志记录

时间:2017-05-24 16:09:03

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

我正在使用本教程: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();
        }

就像返回deferred.promise()一样,它会离开SignalR.js并返回UI中的调用脚本。

1 个答案:

答案 0 :(得分:1)

想出来。所以这基本上可以追溯到我原来的问题:Question最初源于使用SignalR 1.2.2和JQuery版本3

来自我的&#34;更新2&#34;

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

由于在Jquery中弃用了.load,因此出现了问题。 3我需要根据以下内容将.load更改为.on:

  

中断更改:.load(),. unload()和.error()已删除

     

这些方法是事件操作的快捷方式,但有几个API限制。事件.load()方法与ajax .load()方法冲突。由于DOM方法的定义方式,.error()方法无法与window.onerror一起使用。如果您需要通过这些名称附加事件,请使用.on()方法,例如将$(&#34; img&#34;)。加载(fn)改为$(&#34; img&#34;)。on(&#34; load&#34;,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,这可能是您的问题和解决方案。