webforms asp.net和signalr,只能在一个页面中使用

时间:2014-03-31 17:26:43

标签: signalr

我开发了一个webforms asp.net网站,其中包含信号到实时通信。

我有master.page,其中包含与signalr相关的所有内容。

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

在一个内容页面中,我添加了另一个js文件来处理信号器的东西,如:

 $(function () {
            $.connection.hub.start()
                .done(function () {
                    console.log('Now connected, connection ID=' + connection.hub.id);

                });
});

一切都很好!

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

所以,我直接在页面上把它放在主人身上:

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

                });
});
</script>

一切都很好,但客户端连接两次,但具有相同的connectionID。无论如何我只能连接一次并在主页面和内容页面之间共享HubProxy吗?

但是,当我尝试根据该主人渲染另一个内容页面时,我发现了一个错误&#34; hub未定义&#34;。

唯一的页面可以正常工作,主页面是第一个将js分隔给信号器的页面。

这是所需的集线器代码:

 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;
        }
.
.
.
.
}

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:4)

我不确定这是什么原因,但我认为它可能与你如何引用脚本有关,对我来说这就是它的工作原理:

<强> 1。定义hubs.js

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

(function ($) {
    $.ajax({
        url: "/signalr/hubs",
        dataType: "script",
        async: false
    });
}(jQuery));

<强> 2。定义捆绑

BundleConfig.cs

如果您的母版页中有<asp:ScriptReference Name="jquery" />,请添加

bundles.Add(new ScriptBundle("~/bundles/SignalR").Include(
        "~/Scripts/jquery-1.11.0.min.js",
        "~/Scripts/jquery.signalR-2.0.3.min.js",
        "~/Scripts/hubs.js"));

否则添加

bundles.Add(new ScriptBundle("~/bundles/SignalR").Include(
        "~/Scripts/jquery.signalR-2.0.3.min.js",
        "~/Scripts/hubs.js"));

第3。添加脚本参考

在捆绑后添加

ScriptManager.ScriptResourceMapping.AddDefinition(
                "signalr",
                new ScriptResourceDefinition
                {
                    Path = "~/bundles/SignalR",
                });

<强> 4。使用脚本参考

在母版页中,在 ScriptManager / Scripts 下添加以下内容,了解有关此项检查的更多信息ASP.NET 4.5 ScriptManager Improvements in WebForms

<asp:ScriptManager runat="server">
    <Scripts>
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="signalr" />
        .
        .
    </Scripts>
</asp:ScriptManager>

修改

如果应用程序未托管在根目录上,则需要将hub.js代码更改为以下内容:

(function ($) {
    $.ajax({
        url: "signalr/hubs",
        dataType: "script",
        async: false
    });
}(jQuery));

领先&#34; /&#34;导致 url 始终指向根

http://domain/signalr/hubs

但没有它,它将指向托管文件夹

http://domain/yourAppFolder/signalr/hubs