MVC SignalR не запускается из метода сообщения контроллера

При сохранении расписания в календаре он должен автоматически обновлять журналы активности на моей панели уведомлений в моем домашнем контроллере. Он сохраняет данные, но отображается только при обновлении панели уведомлений. Похоже хаб не запускается при сохранении.

CalendarController.cs

       [HttpPost]
        public JsonResult SaveSchedule(Schedule s)
        {
            var userid = User.Identity.GetUserId();
            var profile = _context.Profiles.Single(p => p.Id == userid);
            var status = false;

            if (s.Schedule_ID > 0)
            {
                //Update
                var v = _context.Schedules.Where(a => a.Schedule_ID == s.Schedule_ID).FirstOrDefault();
                if (v != null)
                {
                    v.Shift = s.Shift;
                }

            }

            var activitylog = new ActivityLog
            {
                UserId = userid,
                LogDate = DateTime.Now,
                Activity = ActivityHelper.GetActivityLog(4, profile.FirstName)

            };
             // save to data and must be shown on notification bar
            _context.ActivityLogs.Add(activitylog);
            _context.SaveChanges();
            ActivityHub.StartLogging();
            status = true;
            return new JsonResult { Data = new { status = status } };
        }

HomeController.cs

public JsonResult GetLogs()
        {
            return Json(ActivityHelper.GetActivityLogs(), JsonRequestBehavior.AllowGet);
        }

ActivityHub.cs

 public class ActivityHub : Hub
    {
        public static void StartLogging()
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ActivityHub>();

            //calls the signalR client part to execute javascript method
            context.Clients.All.displayLog();
        }
    }

Мой CSHTML

<script>
    $(function () {
   var activityFromHub = $.connection.activityHub;
        $.connection.hub.start().done(function () {
            FetchLogs();
        });

        activityFromHub.client.displayLog = function () {
            console.info('Hub Started');
            FetchLogs();
        }

function FetchLogs() {

            $.ajax({
                type: 'GET',
                url: '/Home/GetLogs',
                datatype: 'json',
                success: function (data) {
                    $("#logs tr").remove();
                    data = $.parseJSON(data);
                    if (data.length > 0) {
                           .... do some append here
                    }
                },
                error: function (error) {
                    alert("error");
                }
            });
        }
});
</script>

ActivityHelper.cs

static readonly string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

public static class ActivityHelper
    {
            public static string GetActivityLogs()
            {
                string sqlCommand = @"my select query here";
                try
                {
                    var messages = new List<ActivityLog>();
                    using(var connection = new SqlConnection(connString))
                    {
                        connection.Open();
                        using (SqlConnection con = new SqlConnection(connString))
                        {
                            SqlCommand cmd = new SqlCommand(sqlCommand, con);
                            if (con.State != System.Data.ConnectionState.Open)
                            {
                                con.Open();
                            }
                            cmd.Notification = null;
                            SqlDependency dependency = new SqlDependency(cmd);
                            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                            var reader = cmd.ExecuteReader();

                            while (reader.Read())
                            {
                                messages.Add(item: new ActivityLog
                                {
                                    Activity = reader["Activity"] != DBNull.Value ? (string)reader["Activity"] : "",
                                    LogDate = (DateTime)reader["LogDate"]
                                });
                            }
                        }
                    }
                    var jsonSerialiser = new JavaScriptSerializer();
                    var json = jsonSerialiser.Serialize(messages);
                    return json;

                }
                catch(Exception ex)
                {
                    throw;
                }
            }



public static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if (e.Type == SqlNotificationType.Change)
            {
                SqlDependency dependency = sender as SqlDependency;
                dependency.OnChange -= dependency_OnChange;

                var activityHub = GlobalHost.ConnectionManager.GetHubContext<ActivityHub>();
                GetActivityLogs();
            }
        }

}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
127
1

Ответы 1

ПЕРВЫЙ МЕТОД Первое решение измените свой код javascript следующим образом. Если это не сработает, перейдите ко второму способу:

 $(function () {
   var activityFromHub = $.connection.ActivityHub;
        $.connection.hub.start().done(function () {
            FetchLogs();
        });

        activityFromHub.client.displayLog = function () {
            console.info('Hub Started');
            FetchLogs();
        }
});

ВТОРОЙ МЕТОД:

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

Думаю, самое простое решение вашего вопроса - использовать группы. http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups

Ваш хаб-класс будет содержать методы для присоединения к группе:

public Task JoinGroup(string groupName)
{
    return Groups.Add(Context.ConnectionId, groupName);
}

public Task LeaveGroup(string groupName)
{
    return Groups.Remove(Context.ConnectionId, groupName);
}

и ваш хаб будет выглядеть так:

public static void StartLogging(string groupName)
{
   IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ActivityHub>();
   context.Clients.Group(groupName).displayLog();

   //calls the signalR client part to execute javascript method
   //context.Clients.All.displayLog();
}

И измените свой javascript следующим образом:

$(function () {
   var activityFromHub = $.connection.ActivityHub;
        $.connection.hub.start().done(function () {
            activityFromHub.server.joinGroup("Group1");
            activityFromHub.server.StartLogging("Group1");
            FetchLogs();
        });

        activityFromHub.client.displayLog = function () {
            console.info('Hub Started');
            FetchLogs();
        }
});

Надеюсь, это решит вашу проблему. Если вы все еще сталкиваетесь с проблемой. Пожалуйста, оставляйте комментарии. Спасибо.

Другие вопросы по теме