我正在使用本教程: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中的调用脚本。
答案 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,这可能是您的问题和解决方案。