我开发了一个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;
}
.
.
.
.
}
有什么建议吗?
由于
答案 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