Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Clients.Group时未触发SignalR Javascript客户端回调_Javascript_Signalr_Signalr.client - Fatal编程技术网

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

使用Clients.Group时未触发SignalR Javascript客户端回调,javascript,signalr,signalr.client,Javascript,Signalr,Signalr.client,我用的是信号机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); } } 我有一个控制台应用程序和一个连

我用的是信号机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);
    }
}
我有一个控制台应用程序和一个连接到此中心的Web应用程序(asp.net webforms)。控制台应用程序的工作原理与我预期的一样,问题在于Javascript部分。当我使用SendMsg中的Clients.Group时,如果我将SendMsg更改为此,则不会触发“send”回调

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>

var mainHub;
$(函数(){
$.connection.hub.url='0http://localhost:4341/signalr';
//动态创建的代理
mainHub=$.connection.imgHub;
mainHub.client.send=函数(msg){
警报(msg);
};
//启动连接
$.connection.hub.start(函数(){
mainHub.server.create('vanuit den JS');
})
.done(函数(){
$('#msgButton')。单击(函数(){
mainHub.server.sendMsg(“来自JS的消息”);
});
});
});
正如您在JS代码中看到的,我在页面上还有一个调用SendMsg函数的按钮,消息确实到达控制台应用程序,因此我猜JS客户机在SignalR组中已正确注册


我不是JS专家,所以我希望比我更了解它的人能在这里帮助我。

发送函数可能无法执行的原因之一是,当您允许在客户端上调用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通过

我知道这是一个很难回答的问题,因为你可能在连接启动后等待了很长一段时间,仍然没有任何事情发生,但我无法复制我这方面的行为


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

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

GlobalHost.HubPipeline.EnableAutoRejoiningGroups();
这里有更多的细节:


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

thx获取答案,但结果是相同的。我确信我的服务器端函数被调用了,断点被命中了,客户端也被激活了。这一切都很好——GlobalHost.HubPipeline.EnableAutoRejoiningGroups();但它确实解决了问题,谢谢!