Como puede ver en esta Documentación de Microsoft sobre el tiempo de espera y la configuración de keepalive , puede definir el Tiempo de desconexión en las opciones.
Ejemplo:
protected void Application_Start(object sender, EventArgs e)
{
// Make long-polling connections wait a maximum of 110 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
// Wait a maximum of 30 seconds after a transport connection is lost
// before raising the Disconnected event to terminate the SignalR connection.
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
// For transports other than long polling, send a keepalive packet every
// 10 seconds.
// This value must be no more than 1/3 of the DisconnectTimeout value.
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
RouteTable.Routes.MapHubs();
}
Editar : dado que desea eliminar la conexión del cliente sin importar qué, está hablando de un CancellationToken
comportamiento, pero desafortunadamente esto aún no es compatible con SignalR, como puede ver aquí y aquí , el equipo quiere hacerlo, SignalR
pero aún existe No hay noticias al respecto.
Lea este documento de Microsoft sobre el evento de por vida de Hub. Puede cambiar los valores predeterminados para esta configuración, establecerlos
Application_Start
en suGlobal.asax
archivo. Pero de esta manera no puedes controlar completamente el lado del cliente. Por lo tanto, utiliza lasetTimeout
función de JavaScript y pasa el tiempo de finalización del servidor cuando un nuevo usuario se conecta o puede hacerlo enGlobalHost.Configuration.DisconnectTimeout
cualquier momento que desee. Doy un ejemplo completo con proyecto de demostración. En realidad, uso esta lógica en un sistema de tickets muy grande para boleto de retención en tiempo real. (por favor lea todos los comentarios en línea)Modelo:
Cubo:
TestView:
hub.js:
(Probado)
fuente
Necesita definir un tiempo de espera. En el servidor puede configurar DisconnectTimeout, de esta manera:
https://zzz.buzz/2016/05/11/setting-timeout-for-signalr-for-easier-debugging/
fuente
Edición actualizada, consulte la Opción 3 a continuación. Todos los demás dependen del tiempo de espera, publiqué una desconexión forzada.
Si está intentando una desconexión forzada, puede obtener la lista de los usuarios conectados y llamar a la
ForceLogOut
función en el lado del servidor, lo vi en algún lugar del proyecto de código, espero que ayude. Si solo desea forzar el cierre de sesión / matar a algunos de los usuarios, simplemente realice un bucle y elimine solo esa conexión.Lado del servidor
Lado del cliente
Actualizado con la opción 3 : según la solicitud ... las otras soluciones dependen del tiempo de espera, pero también puede forzarlo directamente eliminando la conexión usted mismo
Abrí el código SignalR, y dentro de usted puede ver
DisposeAndRemoveAsync
la terminación real de una conexión de cliente.1- Puedes modificar o llamar
DisposeAndRemoveAsync
con tu conexión.2- Entonces llama
RemoveConnection(connection.ConnectionId);
Precaución, limpie usted mismo cuando haya terminado.
fuente
$.connection.hub.stop()
arroja un error porque la solicitud no se ha enviado completamente al Backend. Por lo tanto, estoy buscando una solución que elimine la conexión actualmente activa, incluso si hay una solicitud en ejecución.