King Fisher Ответов: 1

Реализация signalr для проверки данных в базе данных каждые несколько секунд


Я реализовал SingalR с существующим приложением web Api, где класс SignalR hub будет проверять базу данных каждые несколько секунд и обновлять подключенные клиенты на основе идентификатора соединения.

вот мой хаб класс :

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();
        }
    }
}



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

например: для метода PushNotificationData клиентское приложение будет передавать userID динамично. В приведенном выше коде я написал логику, когда userID ==3143 , ответ должен быть "подтвержден", иначе "не подтвержден".

если я запускаю приложение в одном браузере, я получаю ответ каждые 6 секунд как 'validated'

но если я запускаю приложение на двух или более параллельно,я получаю ответ каждые 6 секунд, как когда-то 'validated"когда-нибудь "not validated'.

Наверное, что-то случилось. пожалуйста, помогите мне.

Что я уже пробовал:

Я попробовал Lock statement может исправить мою проблему, но это не так.

1 Ответов

Рейтинг:
2

pjaar89

Привет,

Можешь попробовать

Clients.Caller.NotificationToClient(NotificationResult);


Кроме того, если вы хотите сопоставить пользователей и соединения, вы должны прочитать Сопоставление пользователей SignalR с подключениями / ASP.NET сайт[^]