2016-12-19 2 views
0

J'ai mis en SingalR avec application Api Web existant, où la classe de plaque tournante SignalR vérifiera la base de données pour toutes les quelques secondes et mettre à jour les clients qui sont connectés via la connexion Id.mise en œuvre SIgnalR pour vérifier les données dans la base de données pour toutes les quelques secondes

ici est ma classe de plaque tournante:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Microsoft.AspNet.SignalR; 
using System.Threading.Tasks; 
using VHC.Core.Business.Managers.Old; 
using VHC.Core.Common.Requests; 
using VHC.Core.Business.Interfaces; 
using VHC.Core.ServiceProxy.ServiceProxies; 

namespace VHC.Core.WebAPI 
{ 
    public class NotifyHub : Hub 
    { 

     public static string ConnectionId { get; set; } 
     public string NotificationResult { get; set; } 

     //public NotifyHub() 
     //{ 
    //} 


     public void PushNotificationData(Int32 userId, Int16 userTypeId) 
     { 

      lock (this) 
      { 
       var request = new PushNotificationRequest 
       { 
        FilterProperty = new Common.Filters.FilterProperty { Offset = 0, RecordLimit = 0, OrderBy = "datechecked desc" }, 
        Filters = new List<Common.Filters.FilterObject> { new Common.Filters.FilterObject { LogicOperator = 0, ConditionOperator = 0, Function = 0, FieldName = "", FieldValue = "", FieldType = 0 } } 
       }; 
       INotificationManager inotifity = new NotificationManager(); 
       var taskTimer = Task.Run(async() => 
       { 
        while (true) 
        { 
         //var serviceProxy = new NotificationServiceProxy(); 
         // var NotificationResult = inotifity.PublishResultsAsync(request, userId, userTypeId);--check database 

         if (userId == 3134) 
         { 
          NotificationResult = "validated"; 
          //Sending the server time to all the connected clients on the client method SendServerTime() 
          Clients.Client(ConnectionId).NotificationToClient(NotificationResult); 
         } 
         else 
         { 
          NotificationResult = "not validated"; 

          //Sending the server time to all the connected clients on the client method SendServerTime() 
          Clients.Client(ConnectionId).NotificationToClient(NotificationResult); 
         } 

         //Delaying by 6 seconds. 
         await Task.Delay(6000); 
        } 
       }); 
      } 
     } 

     public override Task OnConnected() 
     { 
      ConnectionId = Context.ConnectionId; 

      return base.OnConnected(); 
     } 
    } 
} 

Problème Je suis face est, Comme nous le savons application client créer une instance de plaque tournante et la connexion sera établie. Lorsque je lance une application client en même temps, je n'ai aucun problème. Quand je suis en cours d'exécution de l'application cliente à deux ou plus en parallèle, je reçois un problème qui signifie que les données sont complètement foiré. Par exemple: pour la méthode PushNotificationData, l'application client transmettra le userID dynamiquement. Dans le code ci-dessus, j'ai écrit une logique quand userID ==3143, la réponse devrait être «validée», sinon «non validée».

si je suis en cours d'exécution d'une application dans un navigateur, je reçois la réponse toutes les 6 secondes comme « validé »

mais si je suis en cours d'exécution d'une application à deux ou plus en parallèle, je reçois la réponse toutes les 6 secondes comme parfois «validée» quelque temps «non validée».

Je suppose que quelque chose foiré. bien vouloir m'aider. J'espère que c'est clair.

Répondre

0

cycle de vie Hubs est "per request".

vous ne devriez pas enregistrer tout état dans le moyeu et appeler la fonction cycliste async bien sûr. Essayez de réécrire votre code comme suit:

  • Créer cycle de démarrage lors de votre séparé de l'application (près de app.MapSinglaR() ou quelque chose comme ça).
  • Créer statique simultanée dictionnaire ou d'une liste ou tout ce que vous avez besoin et l'utiliser pour stocker les utilisateurs actifs.
  • Get exemple Hub dans votre cycle async utilisant GlobalHost.ConnectionManager.GetHubContext<NotifyHub>().