When running locally through VS - IIS Express it all works fine 100%.
When i then publish to a webserver (on network or online) I have some event stop firing for "OnConnected"... but not all the time. If i refresh it might then fire or it may not.
The problematic event is ResetTimer, see below for example code.
I have logging on and the console is not showing any errors.
I am using 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');
}
}
});
Relavent section of hub
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();
}
Console
[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'.
Addendum
Doesn't actually seem to work 100% locally (just most the time), i think it may be an issue introduced through latency?
Not a satisfying fix but adding a thread sleep before ResetTimer() seems to have fixed it.
Addendum
Even even better fix, issue is Groups.Add is ASYNCHRONOUS!! awaiting it solves the issue also. (dont forget to make OnConnected async too)