Как вы можете видеть в этой документации Microsoft о настройках времени ожидания и активности активности, вы можете определить DisconnectTimeout в опциях.
Пример:
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();
}
Изменить : Поскольку вы хотите разорвать соединение от клиента, несмотря ни на что, вы говорите о CancellationToken
поведении, но, к сожалению, это все еще не поддерживается в SignalR, как вы можете видеть здесь и здесь , команда хочет сделать это, SignalR
но все еще есть нет новостей об этом.
Пожалуйста, прочитайте этот документ Microsoft о жизни Hub. Вы можете изменить значения по умолчанию для этих настроек, установить их
Application_Start
в своемGlobal.asax
файле. Но таким образом вы не можете полностью контролировать клиентскую часть. Таким образом, вы используетеsetTimeout
функцию javascript и передаете конец сервера формы времени, когда новый пользователь connect.it может бытьGlobalHost.Configuration.DisconnectTimeout
или в любое время, когда вы захотите. Я приведу полный пример с демо-проектом. На самом деле я использую эту логику в очень большой системе продажи билетов для хранения билетов в реальном времени. (пожалуйста, прочитайте весь встроенный комментарий)Модель:
Hub:
TestView:
hub.js:
(Испытано)
источник
Вам нужно определить время ожидания. На сервере вы можете установить DisconnectTimeout, например так:
https://zzz.buzz/2016/05/11/setting-timeout-for-signalr-for-easier-debugging/
источник
Обновленное редактирование, см. Вариант 3 ниже. Все остальные полагаются на таймаут, я выложил принудительное отключение.
Если вы пытаетесь принудительно отключить - вы можете получить список подключенных пользователей и вызвать
ForceLogOut
функцию на стороне сервера, я видел это где-то в проекте кода, надеюсь, это поможет. Если вы хотите принудительно отключить / отключить некоторых пользователей, просто выполните цикл и уничтожьте только это соединение.Сторона сервера
Сторона клиента
Обновлен с опцией 3 : основано на запросе ... другие решения зависят от времени ожидания, но вы также можете принудительно установить его напрямую , выбрасывая соединение самостоятельно
Я открыл код SignalR, и внутри вы можете увидеть
DisposeAndRemoveAsync
фактическое завершение клиентского соединения.1- Вы можете изменить или позвонить
DisposeAndRemoveAsync
с вашим подключением.2- Тогда позвони
RemoveConnection(connection.ConnectionId);
Осторожно, сделайте все самостоятельно, когда это будет сделано.
источник
$.connection.hub.stop()
-Function выдает ошибку, потому что запрос не был полностью отправлен в серверную часть. Поэтому я ищу решение, которое убивает текущее активное соединение, даже если присутствует текущий запрос.