当通过VS-IIS Express在本地运行时,它可以100%正常工作。
当我发布到网络服务器(在网络或在线)时,我有一些事件停止为“OnConnected”触发...但不是所有时间。如果我刷新它可能然后开火或它可能不会。
有问题的事件是ResetTimer,请参阅下面的示例代码。
我已登录,控制台未显示任何错误。
我正在使用signalr 1.0.1
<script type="text/javascript">
var timerTime, setIntervalInstance;
$(function () {
$('#rollresults').tablesorter({ headers: { 0: { sorter: false }, 1: { sorter: true }, 2: { sorter: false } } });
$.connection.hub.logging = true;
// Proxy created on the fly
var chat = $.connection.brewBattleHub;
// Start the connection
$.connection.hub.qs = 'groupName=@ViewContext.RouteData.Values["groupName"]';
$.connection.hub.start().done(function () {
$("#broadcast").click(function () {
// Call the chat method on the server
chat.server.roll($("#drinkname").val(), $("#comment").val().substr(0, 40));
$("#rollresults").show('slow');
$("#broadcast").prop("disabled", "disabled");
$("#drinkname").prop("disabled", "disabled");
$("#comment").prop("disabled", "disabled");
});
setIntervalInstance = window.setInterval(timerTick, 1000);
}).fail(function (reason) {
console.log("SignalR connection failed: " + reason);
//chat.server.sendMessage(@Model.UserName + " has Error! (Check logs)");
});
// Declare a function on the chat hub so the server can invoke it
chat.client.addRoll = function (player, roll, drink, comment) {
$("#rollresults").find("tr").eq(1).removeClass('loserrow');
$('#rollresults tbody').append('<tr><td>' + player + '</td>' + '<td>' + roll + '</td>' + '<td>' + drink + '</td>' + '<td>' + comment + '</td></tr>');
$("#rollresults").trigger("update");
$("#rollresults").tablesorter({ sortList: [[1, 0]] });
$("#rollresults").find("tr").eq(1).addClass('loserrow');
};
chat.client.addMessage = function (message) {
$('#messages').append("<div class='message'>" + message + "</div>");
};
chat.client.resetTimer = function () {
timerTime = 30;
};
function timerTick() {
if (timerTime > 0) {
timerTime = timerTime - 1;
$('#timer').html("<div>Starting in: " + timerTime + "</div>");
$("#timerbox").show('slow');
} else {
clearInterval(setIntervalInstance);
$("#broadcast").removeProp("disabled", "disabled");
$('#timerbox').hide('slow');
}
}
});
中心的关联部分
public override Task OnConnected()
{
var @group = GetOrCreateGroup();
var user = new ConnectedUser { ConnectionId = Context.ConnectionId, Name = Context.User.Identity.Name };
@group.AddUser(user);
foreach (var connectedUser in @group.ConnectedUsers.Where(u => u != user))
{
Clients.Caller.addMessage(HttpUtility.HtmlEncode(connectedUser.Name + " has connected."));
}
Groups.Add(Context.ConnectionId, @group.Name);
Clients.OthersInGroup(@group.Name).addMessage(HttpUtility.HtmlEncode(user.Name + " has connected."));
Clients.Caller.addMessage(HttpUtility.HtmlEncode("You've connected..."));
ResetTimer(@group.Name);
return base.OnConnected();
}
Group GetOrCreateGroup()
{
var groupName = Context.QueryString["groupName"].ToUpper();
var @group = BattleGroups.FirstOrDefault(g => g.Name.ToUpper() == groupName);
if (group == null)
{
group = new Group { Name = groupName };
BattleGroups.Add(group);
}
return @group;
}
public void ResetTimer(string groupName)
{
Clients.Group(groupName).resetTimer();
}
控制台
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Negotiating with '/signalr/negotiate? groupName=Public'. jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Attempting to connect to SSE endpoint 'http://server:88/signalr/connect?transport=serverSentEvents&connectionToke…onData=%5B%7B%22name%22%3A%22brewbattlehub%22%7D%5D&groupName=Public&tid=4' jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: EventSource connected jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000 jquery.signalR-1.0.1.js:54
[09:10:01 GMT+0100 (GMT Daylight Time)] SignalR: Triggering client hub event 'addMessage' on hub 'brewBattleHub'.
实际上似乎并非100%在本地(大部分时间)工作,我认为这可能是通过延迟引入的问题?
答案 0 :(得分:3)
不是令人满意的修复,但在ResetTimer()似乎之前添加线程睡眠以修复它。
Groups.Add(Context.ConnectionId, @group.Name);
Clients.OthersInGroup(@group.Name).addMessage(HttpUtility.HtmlEncode(user.Name + " has connected."));
Clients.Caller.addMessage(HttpUtility.HtmlEncode("You've connected..."));
Thread.Sleep(TimeSpan.FromSeconds(1)); //<<<<<<<<<
ResetTimer(@group.Name);
甚至更好的修复,问题是Groups.Add是ASYNCHRONOUS !!等待它也解决了这个问题。 (别忘了也让OnConnected异步)
public async override Task OnConnected()
{
--->> await Groups.Add(Context.ConnectionId, "TestGroup");
Clients.Group("TestGroup").showBoxOne();
Clients.Group("TestGroup").showBoxTwo();
Clients.Group("TestGroup").showBoxThree();
Clients.Group("TestGroup").showBoxFour();
Clients.Group("TestGroup").showBoxFive();
}
await base.OnConnected();
}