I have a SignalR hub that works fine when a user arrives on the page or when a user leaves the page. The issue is that when a user refreshes the page the OnDisconnectedAsync method is being called AFTER the OnConnectedAsync method. Does that make sense?
This is an issue because when the user connects I update a database table and when they disconnect I update that same table. If the last thing that happened was a disconnect then it gives the impression that the user has left the page, which is not really the case when they refresh the page. Btw, this refresh issue happens in Azure. On my local machine the issue does not happen.
Here are the relevant methods from my test hub page:
public override async Task OnConnectedAsync()
{
//-------------------------------------------------------------
// Get user attributes from ClaimsHelper
UserAttributes userAttObj = ClaimsHelper.GetClaimValues(_httpContextAccessor);
if (userAttObj != null)
{
// Will use loginid for tracking user
loginid = userAttObj.userid;
loggedinuser = userAttObj.loggedin;
sessionNum = userAttObj.SessionNumber;
}
//-------------------------------------------------------------
string conid = Context.ConnectionId;
string ContestGroupName = "ContestGroup0";
await Groups.AddToGroupAsync(conid, ContestGroupName);
string msg = "WELCOME <span class='txtMedGreen'>" + loggedinuser + "</span> (" + conid + "). Time: " + DateTime.Now.ToString();
await Clients.Group(ContestGroupName).SendAsync("UpdateInfo", msg);
await base.OnConnectedAsync();
// ----------------------------------------
}
public override async Task OnDisconnectedAsync(Exception exception)
{
//-------------------------------------------------------------
// Get user attributes from ClaimsHelper
UserAttributes userAttObj = ClaimsHelper.GetClaimValues(_httpContextAccessor);
if (userAttObj != null)
{
// Will use loginid for tracking user
loginid = userAttObj.userid;
loggedinuser = userAttObj.loggedin;
sessionNum = userAttObj.SessionNumber;
}
//-------------------------------------------------------------
string conid = Context.ConnectionId;
//-------------------------------------------------------------
string ContestGroupName = "ContestGroup0";
string msg = "<span class='txtMedGreen'>" + loggedinuser + "</span> (" + conid + ") has LEFT the group. Time: " + DateTime.Now.ToString();
await Clients.Group(ContestGroupName).SendAsync("UpdateInfo", msg);
await base.OnDisconnectedAsync(exception);
// ----------------------------------------
}
Here is the key Javascript code in my View page:
<script src="~/js/signalr/dist/browser/signalr.js"></script>
<script type="text/javascript">
// For showing information via SignalR.
var huburl = "/testhub?cid=0";
var connection = new signalR.HubConnectionBuilder().withUrl(huburl).withAutomaticReconnect().build();
$(document).ready(function () {
// ---- SignalR stuff ---------------------------------------------
connection.on("UpdateInfo", function (msg) {
var strmsg = "<div class='inforow'>" + msg + "</div>";
// alert("strmsg is: " + strmsg);
$("#siginfo").append(strmsg);
});
connection.on("SendGroupMsg", function (msg, fromuser) {
var strmsg = "<div class='msgrow'>" + fromuser + ": " + msg + "</div>";
// alert("strmsg is: " + strmsg);
$("#msgarea").append(strmsg);
});
// This initiates the connection and makes connection info available.
connection.start().catch(function (err) {
alert("Error starting connection: " + err.toString());
return console.error(err.toString());
});
});
</script>
Thanks in advance.
question from:
https://stackoverflow.com/questions/65839460/signalr-disconnects-right-after-connecting-after-page-refresh 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…