【发布时间】: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