MVC SignalR продолжает увеличивать количество запросов при каждой перезагрузке - PullRequest
0 голосов
/ 06 октября 2019

Я создаю приложение ASP.NET MVC, которое использует технологии "SqlDependecy" и "SignalR" для поддержания связи с сервером в режиме реального времени на основе изменений базы данных. Он просто проверяет изменения значения поля в конкретной записи базы данных и затем отображает его в браузере.

Попытка работает отлично. Но когда я отслеживаю сетевые запросы через производительность браузера "Сеть", количество запросов увеличивается на 1 при каждом обновлении страницы.

Reference case screenshot

Asна изображении.

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

и т. Д. *

Код js, который я пробовал, приведен ниже.

Это кажется мне проблемой. Если это реальная проблема, любые советы по этому вопросу будут высоко оценены. Большое спасибо.

<script type="text/javascript">
    $(function () {
        var jHub = $.connection.journeyHub;
        $.connection.hub.start();
        jHub.client.ListenChange = function () {
            getData();
        }
        jHub.client.ListenChange();
    });

    function getData() {
        $.ajax({
            url: 'GetValue',
            type: 'GET',
            dataType: 'json',
            success: function (data) {
                if (data == "pending") {
                    $("#box").css({ "background-color": "orange" });
                }
                else if (data == "deny") {
                    $("#box").css({ "background-color": "red" });
                }
                else if (data == "success") {
                    $("#box").css({ "background-color": "green" });
                }
            }
        });
    }
</script>
<div id="box" style="width:100px; height:100px; background-color: gray;"></div>

[Edit v1] Вот мой контроллер, на котором расположен обработчик событий.

public class TravelController : Controller
{
    SqlConnection link = new SqlConnection(ConfigurationManager.ConnectionStrings["linkTraveller"].ConnectionString);

    // GET: Travel
    public ActionResult Listen()
    {
        return View();
    }

    public ActionResult GetValue()
    {
        using (IDbConnection conn = link)
        {
            string query = @"SELECT [Status] FROM [dbo].[Journey] WHERE [Id]=1";
            SqlCommand command = new SqlCommand(query, link);
            SqlDependency sqlDep = new SqlDependency(command);
            sqlDep.OnChange += new OnChangeEventHandler((sender, e) => sqlDep_OnChange(sender, e));
            conn.Open();
            string status = command.ExecuteScalar().ToString();
            return Json(status, JsonRequestBehavior.AllowGet);
        }
    }

    private void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        JourneyHub.Start();
    }
}

Вот концентратор

public class JourneyHub : Hub
{
    public static void Start()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<JourneyHub>();
        context.Clients.All.ListenChange();
    }
}

1 Ответ

0 голосов
/ 07 октября 2019

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

Вот пример того, что я сделал много лет назад, но идея все та же.

try
        {
            using (
                var connection =
                    new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(@"SELECT [Id]
                                                                        ,[FName]
                                                                        ,[LName]
                                                                        ,[DOB]
                                                                        ,[Notes]
                                                                        ,[PendingReview] 
                                                       FROM [dbo].[Users]",
                    connection))
                {
                    // Make sure the command object does not already have
                    // a notification object associated with it.
                    command.Notification = null;

                    SqlDependency dependency = new SqlDependency(command);

                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                    if (connection.State == ConnectionState.Closed)
                        connection.Open();

                    command.ExecuteReader();
                }
            }
        }
        catch (Exception e)
        {
            throw;
        }
    }

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{   
    SqlDependency dependency = sender as SqlDependency;
    if (dependency != null) dependency.OnChange -= dependency_OnChange;
    //Recall your SQLDependency setup method here.
    SetupDependency();
    JobHub.Show();
}
...