使用Clients.Group时,SignalR Javascript客户端回调未触发

时间:2013-01-18 15:13:03

标签: javascript signalr signalr.client

我使用SignalR RC2,这是我的中心

public class ImgHub : Hub
{
    public void Create(string guid)
    {
        Groups.Add(Context.ConnectionId, "foo");
    }

    public void SendMsg(string msg)
    {
        Clients.Group("foo").send(msg);
    }
}

我有一个控制台应用程序和一个连接到该集线器的webapplication(asp.net webforms)。控制台应用程序正如我所期望的那样工作,问题出在Javascript部分。 "发送"如果我将SendMsg更改为此

,当我在SendMsg中使用Clients.Group时,回调不会触发
public void ShareImage(byte[] image, string guid)
{
    Clients.All.ReceiveImage(image);
}

它有效。这是Javascript代码

<script src="Scripts/jquery-1.7.1.min.js"></script>
<script src="Scripts/jquery.signalR-1.0.0-rc2.min.js"></script>
<script src="http://localhost:4341/signalr/hubs/" type="text/javascript"></script>
<script type="text/javascript">
    var mainHub;
    $(function () {
        $.connection.hub.url = 'http://localhost:4341/signalr';
        // Proxy created on the fly
        mainHub = $.connection.imgHub;

        mainHub.client.send = function (msg) {
            alert(msg);
        };

        // Start the connection
        $.connection.hub.start(function() {
            mainHub.server.create('vanuit den JS');
        })
            .done(function() {
                $('#msgButton').click(function() {
                    mainHub.server.sendMsg("msg from JS");
                });
            });
    });

</script>

正如您在JS代码中看到的那样,我在页面上还有一个调用SendMsg函数的按钮,消息确实到达控制台应用程序,因此我猜测JS客户端在SignalR组中正确注册。

我没有JS专家,所以我希望有更多了解它的人能帮到我。

2 个答案:

答案 0 :(得分:2)

这是因为您需要在全局asax中启用重新加入组。

GlobalHost.HubPipeline.EnableAutoRejoiningGroups();

这里有更详细的信息: http://weblogs.asp.net/davidfowler/archive/2012/11/11/microsoft-asp-net-signalr.aspx

此方法调用将消失1.0 RTM,但现在你需要这样做。

答案 1 :(得分:0)

您的发送功能可能无法执行的原因之一是因为当您允许在客户端上调用sendMsg时,客户端可能还不在“foo”组中。

在你的$ .connection.hub.start中,你正在注册一个在start完成时要调用的函数,但是你也正在注册另一个函数,一旦start通过.done完成就被调用。因此,正在发生的是两种功能几乎同时发射。因此,当可以调用sendMsg函数时,您可能尚未成功添加到组中。

以下是解决该问题的方法:

$.connection.hub.start().done(function() {
    mainHub.server.create('vanuit den JS').done(function() {
        $('#msgButton').click(function() {
            mainHub.server.sendMsg("msg from JS");
        });
    });
});

基本上我等到组加入成功完成,直到允许sendMsg通过。

我知道这是一个很长的答案,因为您可能在连接开始后等待了很长时间,但仍然没有通过电线,但我无法复制我的行为。< / p>

如果上面的修复不起作用,您应该确保通过设置断点来调用服务器端功能。