Salve amici, in Signalr al refresh della pagina si perde la connessione e se ne crea una nuova causando il fastidioso "off-on" dell'utente. A tal proposito per ovviare all'inconveniente avrei pensato di salvare la session-state della pagina in un file xml e poi richiamarlo, è corretto? C'è un metodo migliore? Come dovrei operare? Il codice lato server che ho implementato è questo:
Imports Microsoft.AspNet.SignalR
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports Chatproject.SignalRChat.Common
Imports System.Threading.Tasks
Imports Microsoft.Owin
Imports Owin
Namespace Chatproject
Public Class ChatHub
Inherits Hub
#Region "Data Members"
Shared ConnectedUsers As New List(Of UserDetail)()
Shared CurrentMessage As New List(Of MessageDetail)()
#End Region
#Region "Methods"
Public Sub Connect(userName As String)
Dim id = Context.ConnectionId
If ConnectedUsers.Where(Function(x) x.ConnectionId = id).Count = 0 Then
ConnectedUsers.Add(New UserDetail() With { _
.ConnectionId = id, _
.UserName = userName _
})
' send to caller
Clients.Caller.onConnected(id, userName, ConnectedUsers, CurrentMessage)
' send to all except caller client
Clients.AllExcept(id).onNewUserConnected(id, userName)
End If
End Sub
Public Sub Send(ByVal msg As String, ByVal room As String, ByVal userName As String)
Clients.Group(room).addMessage(msg, room)
Clients.Group(room).messageReceived(userName, msg)
AddMessageinCache(userName, msg)
End Sub
Public Sub JoinRoom(ByVal roomName As String, ByVal userName As String)
Groups.Add(Context.ConnectionId, roomName)
Dim msg As String = "<div class='text-muted'>" & userName & " joined the chat.</div>"
Clients.Group(roomName).addMessage(msg, roomName)
Clients.Group(roomName).messageReceived(userName, msg)
End Sub
Public Sub LeaveRoom(ByVal roomName As String, ByVal userName As String)
Groups.Remove(Context.ConnectionId, roomName)
Dim msg As String = "<div class='text-muted'>" & userName & " quit the chat.</div>"
Clients.Group(roomName).addMessage(msg, roomName)
Clients.Group(roomName).messageReceived(userName, msg)
End Sub
Public Sub SendPrivateMessage(toUserId As String, message As String)
Dim fromUserId As String = Context.ConnectionId
Dim toUser = ConnectedUsers.FirstOrDefault(Function(x) x.ConnectionId = toUserId)
Dim fromUser = ConnectedUsers.FirstOrDefault(Function(x) x.ConnectionId = fromUserId)
If toUser IsNot Nothing AndAlso fromUser IsNot Nothing Then
' send to
Clients.Client(toUserId).sendPrivateMessage(fromUserId, fromUser.UserName, message)
' send to caller user
Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message)
End If
End Sub
Public Overrides Function OnDisconnected(stopCalled As Boolean) As Threading.Tasks.Task
Dim item = ConnectedUsers.FirstOrDefault(Function(x) x.ConnectionId = Context.ConnectionId)
If item IsNot Nothing Then
ConnectedUsers.Remove(item)
Dim id = Context.ConnectionId
Clients.All.onUserDisconnected(id, item.UserName)
End If
Return MyBase.OnDisconnected(stopCalled)
End Function
#End Region
#Region "private Messages"
Private Sub AddMessageinCache(userName As String, message As String)
CurrentMessage.Add(New MessageDetail() With { _
.UserName = userName, _
.Message = message _
})
If CurrentMessage.Count > 100 Then
CurrentMessage.RemoveAt(0)
End If
End Sub
#End Region
End Class
End Namespace
Grazie a tutti.
Modificato da MarkRoss il 26 gennaio 2018 19.23 -