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.