Сообщение SignalR потеряно при навигации клиента

Я успешно реализовал SignalR.

Я использую его, чтобы показать начальные разговоры между пользователями на сайте, поэтому, когда кто-то хочет пообщаться с кем-то еще, с помощью SignalR отправляется простое сообщение.

Это работает хорошо, за исключением одной ситуации. Если запрос отправляется в то же время, что и тот, который должен был получить, он выполняет запрос новой страницы, например, навигацию по сайту, сообщение теряется.

Я вижу, что срок действия сообщений истекает через 30 секунд в InProcMessageBus, но я не думаю, что это проблема, так как я тестирую на своей машине, и загрузка страницы занимает максимум 1-2 секунды.

Так это на самом деле по замыслу? Или я делаю это неправильно?

Спасибо.


person Aleksandar Hocevar    schedule 12.03.2012    source источник
comment
Я в замешательстве, вы говорите, что если вы нажмете обновить, как только сообщение будет отправлено, оно не будет получено?   -  person davidfowl    schedule 14.03.2012
comment
Я думаю, что на самом деле сообщение отправляется клиенту, просто клиент его пропускает, например, событие на хаб никогда не срабатывает, так как браузер уже находится в режиме перезагрузки страницы, и когда новая страница перезагружается, клиент не получает сообщение, конечно. Я думаю, вы ясно дали понять, что это по замыслу. Поэтому я также должен отслеживать сообщения на сервере. Спасибо, в любом случае.   -  person Aleksandar Hocevar    schedule 14.03.2012


Ответы (1)


Это как-то по дизайну. Когда пользователь создает новое соединение, он по умолчанию получает новый идентификатор клиента. Это, вероятно, причина проблемы, если вы не определили свой собственный IConnectionIdFactory. Если вы хотите убедиться, что клиент всегда получает один и тот же идентификатор, вы должны создать свою собственную реализацию этого и установить ее следующим образом:

DependencyResolver.Register(typeof(IConnectionIdFactory), () => new CustomIdFactory());

Расширяемость в SignalR — https://github.com/SignalR/SignalR/wiki/Extensibility

Пример заводской замены clientID: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

person Gary.S    schedule 13.03.2012
comment
Спасибо за ответ. Извините, я не упомянул об этом в вопросе, но я уже сделал это. Я использовал идентификатор пользователя, который вошел в систему, и, глядя на запрос через fiddler, я вижу, что connectionId одинаков для каждого запроса от одного и того же пользователя. Так что на самом деле моя проблема все еще сохраняется, даже если я использую свой собственный уникальный идентификатор подключения. - person Aleksandar Hocevar; 13.03.2012