Signalr webforms asp.net和Signal仅在一个页面中工作

Signalr webforms asp.net和Signal仅在一个页面中工作,signalr,Signalr,我开发了一个webforms asp.net站点,该站点使用signalr进行实时通信 我已定义了与信号机相关的所有内容的master.page <%: Scripts.Render("~/Scripts/jquery-1.11.0.min.js") %> <%: Scripts.Render("~/Scripts/jquery.signalR-2.0.3.min.js") %> <%: Scripts.Render("~/signalr/h

我开发了一个webforms asp.net站点,该站点使用signalr进行实时通信

我已定义了与信号机相关的所有内容的master.page

    <%: Scripts.Render("~/Scripts/jquery-1.11.0.min.js") %>
    <%: Scripts.Render("~/Scripts/jquery.signalR-2.0.3.min.js") %>
    <%: Scripts.Render("~/signalr/hubs") %>
一切都好

然后我尝试将对signalR hub的访问扩展到其他页面,包括母版页

所以,我把它放在主页上的master direct中:

 <script type="text/javascript">
        $(function () {
            $.connection.hub.start()
                .done(function () {
                    console.log('Now connected MASTER, connection ID=' + $.connection.hub.id);

                });
});
</script>

$(函数(){
$.connection.hub.start()
.done(函数(){
log('Now connected MASTER,connection ID='+$.connection.hub.ID);
});
});
一切正常,但客户端连接了两次,但连接ID相同。是否有任何方法可以只连接一次并在母版页和内容页之间共享HubProxy

但是,当我尝试基于该主控形状呈现另一个内容页时,出现了一个错误“hub未定义”

唯一可以与该母版页配合使用的页面是第一个将js与Signal分离的页面

以下是所需的集线器代码:

 public class GameHub : Hub
    {
        private const long tempoJogada = 30000;
        private const long tempoTruco = 30000;
        private const long tempoMao11 = 30000;

        private readonly static Model.Truco _truco = new Model.Truco();
        private Mesa _mesa;

        private static int JogadoresOnline = 0;

        public GameHub()
        {
            _mesa = _truco.Saloes[0].Mesas[0];

            Debug.WriteLine("criou hub : " + DateTime.Now);
        }

        public List<Jogador> RetornaJogadoresMesa()
        {
            return _mesa.Jogadores;
        }


        public async Task<int> EntrarMesa(Jogador jogador)
        {
            int posicaoMesa = 0;
            Jogador jogadorServer = _mesa.Jogadores.SingleOrDefault(jo => jo.Nome == jogador.Nome);

            jogador.ClientGuid = new Guid(Context.ConnectionId);
            if (_mesa.Jogadores.Count(jo => jo.Nome == jogador.Nome) == 0)
            {

                posicaoMesa = _mesa.EntrarMesa(jogador);
                if (posicaoMesa > 0)
                {
                    await Groups.Add(Context.ConnectionId, _mesa.NomeMesa);
                    Clients.Group(_mesa.NomeMesa).entrarMesa(jogador.Nome, posicaoMesa);
                }


                if (_mesa.QuantidadeVagas == 0)
                {
                    IniciarJogo();
                }
            }
            else
            {
                // ja estava na mesa (reconectando)
                await Groups.Add(Context.ConnectionId, _mesa.NomeMesa);
                if (jogadorServer != null)
                    posicaoMesa = _mesa.Jogadores.IndexOf(jogadorServer) + 1;
            }

            return posicaoMesa;
        }

        private void IniciarJogo()
        {
            EnviaCartas(true);

            _mesa.EstaJogando = true;
        }
.
.
.
.
}
公共类游戏中心:中心
{
私人建筑长坦波约加达=30000;
私人康斯特朗·坦波特鲁科=30000;
私人常数长tempoMao11=30000;
私有只读静态模型.Truco _Truco=新模型.Truco();
私人梅萨(美萨),;
私有静态int JogadoresOnline=0;
公共游戏中心()
{
_mesa=_-truco.Saloes[0].mesa[0];
Debug.WriteLine(“criou hub:+DateTime.Now”);
}
公开名单
{
返回_mesa.Jogadores;
}
公共异步任务entramesa(Jogador-Jogador)
{
int posicaoMesa=0;
Jogador jogadorServer=_mesa.Jogadores.SingleOrDefault(jo=>jo.Nome==Jogador.Nome);
jogador.ClientGuid=新Guid(Context.ConnectionId);
if(_mesa.Jogadores.Count(jo=>jo.Nome==jogador.Nome)==0)
{
posicaoMesa=_mesa.entramesa(jogador);
如果(posicaoMesa>0)
{
等待组。添加(Context.ConnectionId,_mesa.NomeMesa);
客户群(_-mesa.NomeMesa).entramesa(jogador.Nome,posicaoMesa);
}
如果(_mesa.QuantidadeVagas==0)
{
IniciarJogo();
}
}
其他的
{
//ja estava na mesa(重新连接)
等待组。添加(Context.ConnectionId,_mesa.NomeMesa);
if(服务器!=null)
posicaoMesa=_mesa.Jogadores.IndexOf(jogadorServer)+1;
}
返回posicaoMesa;
}
私有无效IniciarJogo()
{
EnviaCartas(真实);
_mesa.EstaJogando=真;
}
.
.
.
.
}
有什么建议吗


谢谢

我不确定这是否是原因,但我认为这可能与您引用脚本的方式有关,对我来说,这就是它的工作方式:

1。定义hubs.js

使用来自的解决方案 定义一个名为hubs.js的js文件,其中包含

(function ($) {
    $.ajax({
        url: "/signalr/hubs",
        dataType: "script",
        async: false
    });
}(jQuery));
2。定义捆绑包

BundleConfig.cs中

如果您有

前导“/”使url始终指向根

http://domain/signalr/hubs
但如果没有它,它将指向托管文件夹

http://domain/yourAppFolder/signalr/hubs

我不确定这是原因,但我认为可能与您引用脚本的方式有关,对我来说,这就是它的工作方式:

1。定义hubs.js

使用来自的解决方案 定义一个名为hubs.js的js文件,其中包含

(function ($) {
    $.ajax({
        url: "/signalr/hubs",
        dataType: "script",
        async: false
    });
}(jQuery));
2。定义捆绑包

BundleConfig.cs中

如果您有

前导“/”使url始终指向根

http://domain/signalr/hubs
但如果没有它,它将指向托管文件夹

http://domain/yourAppFolder/signalr/hubs

为什么您只想有一个连接?母版页中的代码只提供了在所有页面中共享代码的便利,SignalR javascript api是可用的,这样页面之间的实时通信是可能的,如果这不是您需要的,也许您应该使用服务层ROK进行连接,但我的问题是,当将脚本插入到母版时,由此派生的每个内容页都会得到“hub未定义”。正如我提到的,我启动的第一个内容页正在工作。谢谢,为此,请发布中心代码,以再现问题部分中心代码如上所示。再次感谢,这让我抓狂你为什么只想有一个连接?母版页中的代码只提供了在所有页面中共享代码的便利,SignalR javascript api是可用的,这样页面之间的实时通信是可能的,如果这不是您需要的,也许您应该使用服务层ROK进行连接,但我的问题是,当将脚本插入到母版时,由此派生的每个内容页都会得到“hub未定义”。正如我提到的,我启动的第一个内容页正在工作。谢谢,为此,请发布中心代码,以再现问题部分中心代码如上所示。再次感谢,这让我发疯。非常感谢你的回答。我只是不让脚本出错和缩小,以使场景更简单,但实际上它似乎真的与脚本有关。所以我按照你的指示放回了blundle,结果改变了,现在master中的脚本连接到了hub,但是它说“HubProxy现在未定义”,顺便说一句,我首先开发的页面仍然没有任何问题(奇怪)。我明天会深入调查,试图找出答案。谢谢again@gilberto不客气,可能是因为你的应用程序结构,你定义脚本的方式在页面中工作,而不是在主控中工作,比如在根目录中的页面,但在文件夹中的主控…等等
(function ($) {
    $.ajax({
        url: "signalr/hubs",
        dataType: "script",
        async: false
    });
}(jQuery));
http://domain/signalr/hubs
http://domain/yourAppFolder/signalr/hubs