2017-10-06 40 views
1

J'ai un problème étrange avec la connexion persistante SignalR. Il s'exécute dans un monoservice écrit sur C# et utilise un long transport d'interrogation. L'application s'exécute sur une machine virtuelle Ubuntu à l'intérieur de KVM. La communication entre l'application et les clients HTML/js est la plupart du temps normale, mais pour une raison quelconque, chaque connexion nouvellement créée se comporte comme suit: la connexion est établie et la méthode OnConnected est appelée, cependant, lorsque le client émet une requête "poll", ça expire. Dans 100% des cas lorsque l'application entre dans cet état, le redémarrer n'aide pas: les requêtes "poll" des clients sont toujours expirées. La seule chose qui aide à redémarrer l'ensemble de la machine virtuelle. Y a-t-il quelqu'un qui a déjà vécu quelque chose comme ça? SignalR conserve-t-il toutes les données de connexion dans le système de fichiers, ce qui pourrait expliquer pourquoi, après le redémarrage de l'application, les requêtes d'interrogation longues sont toujours suspendues?SignalR Une connexion persistante débute l'expiration du délai d'interrogation des clients et ne se rétablit pas après le redémarrage

Répondre

0

Stupide moi! Le problème était lié à l'accès à la base de données pendant l'autorisation de la connexion SignalR. La couche d'accès à la base de données était mal conçue et la base de données était verrouillée de temps en temps. La procédure d'authentification attend alors que le verrou DB soit libéré et éventuellement expiré. Comme un conseil à tous ceux qui lisent cette anecdote: dans le cas de PersistentConnection, assurez-vous qu'aucun objet IO-heavy ne se passe dans la méthode AuthorizeRequest! Ou si vous ne pouvez pas éviter cela, il devrait être très soigneusement conçu, sinon vous demandez des délais.