SignalR 服务器到客户端的方法不起作用
SignalR server to client method not working
根据各种资源,signalr
代码应该可以工作,但我无法将通知从服务器发送到客户端。这是 html/javascript 部分:
<script src="/Scripts/jquery-1.6.4.min.js"></script>
<script src="/Scripts/jquery.signalR-2.2.1.min.js"></script>
<script src="/signalr/js"></script>
<script type="text/javascript">
$(function () {
var cHub = $.connection.cHub;
$.connection.hub.logging = true;
cHub.client.sendMessage = function (content) {
$("#container-hub").append($("<p />").html(content));
};
$.connection.hub.start().done(function() {
$('[id$=bGo]').click(
function() {
cHub.server.send('Sync process started');
});
});
});
</script>
<div id="container-hub" style="background: red; height: 100px; width: 100%;"></div>
Hub.cs class:
using Microsoft.AspNet.SignalR;
namespace CMS.Objects
{
public class CHub : Hub
{
public void Send(string message)
{
// Call the broadcastMessage method to update clients.
Clients.All.sendMessage(message);
}
}
}
Startup.cs class:
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(CMS.CStartup))]
namespace CMS
{
public class CStartup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
下面是我如何调用方法 sendMessage
方法:
private void ShowMessage(string message)
{
var clients = GlobalHost.ConnectionManager.GetHubContext<CHub>().Clients;
clients.All.sendMessage(message);
}
单击按钮 bGo
时,消息将附加到 container-hub
div,但当我调用 sendMessage
方法时没有消息。
编辑
一些额外的发现;当我从 OnConnected
方法中调用 sendMessage
时,它起作用了:
public override Task OnConnected()
{
Clients.All.sendMessage("Connection Initialised");
return base.OnConnected();
}
在花了一些时间调查问题后,我终于找到了解决方案。不是 100% 确定,但我认为问题出在页面上使用 UpdatePanel
。将 signalR
javascript 代码包装到 Sys.Application.add_load
而不是使用 jQuery 的 $(function () {
并开始工作。
我提到我不是 100% 确定的原因是 UpdatePanel
和 ScriptManager
已被多次删除,在发布问题之前没有结果。
根据各种资源,signalr
代码应该可以工作,但我无法将通知从服务器发送到客户端。这是 html/javascript 部分:
<script src="/Scripts/jquery-1.6.4.min.js"></script>
<script src="/Scripts/jquery.signalR-2.2.1.min.js"></script>
<script src="/signalr/js"></script>
<script type="text/javascript">
$(function () {
var cHub = $.connection.cHub;
$.connection.hub.logging = true;
cHub.client.sendMessage = function (content) {
$("#container-hub").append($("<p />").html(content));
};
$.connection.hub.start().done(function() {
$('[id$=bGo]').click(
function() {
cHub.server.send('Sync process started');
});
});
});
</script>
<div id="container-hub" style="background: red; height: 100px; width: 100%;"></div>
Hub.cs class:
using Microsoft.AspNet.SignalR;
namespace CMS.Objects
{
public class CHub : Hub
{
public void Send(string message)
{
// Call the broadcastMessage method to update clients.
Clients.All.sendMessage(message);
}
}
}
Startup.cs class:
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(CMS.CStartup))]
namespace CMS
{
public class CStartup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
下面是我如何调用方法 sendMessage
方法:
private void ShowMessage(string message)
{
var clients = GlobalHost.ConnectionManager.GetHubContext<CHub>().Clients;
clients.All.sendMessage(message);
}
单击按钮 bGo
时,消息将附加到 container-hub
div,但当我调用 sendMessage
方法时没有消息。
编辑
一些额外的发现;当我从 OnConnected
方法中调用 sendMessage
时,它起作用了:
public override Task OnConnected()
{
Clients.All.sendMessage("Connection Initialised");
return base.OnConnected();
}
在花了一些时间调查问题后,我终于找到了解决方案。不是 100% 确定,但我认为问题出在页面上使用 UpdatePanel
。将 signalR
javascript 代码包装到 Sys.Application.add_load
而不是使用 jQuery 的 $(function () {
并开始工作。
我提到我不是 100% 确定的原因是 UpdatePanel
和 ScriptManager
已被多次删除,在发布问题之前没有结果。