Веб-сайт не будет отображать записи в базе данных при использовании SqlDependency в сочетании с SignalR - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь загрузить веб-API с MVC 5 и SignalR для обновлений из базы данных. Я тестировал свой код в автономном режиме с локальной базой данных и веб-сайтом localhost. Это работает идеально, как и ожидалось.

Но когда я удаляю код SqlDependency в своей функции веб-API GET, он получает все элементы из базы данных. Но как только я добавлю SqlDependency, это больше не будет работать. Чтобы увидеть, есть ли какие-либо ошибки с концентратором, я добавил этот код $.connection.hub.logging = true; Я использую его, поэтому, когда я нажимаю F12, я могу видеть журналы. В этом журнале все работает нормально с включенным SqlDependency и без него, никаких ошибок не обнаруживается. Поэтому я не уверен, что не так с получением информации из базы данных с помощью SqlDependency.

Это код, который я использовал для веб-API:

[HttpGet]
public IEnumerable<TeamManager.Team> GetAllTeams()
{
    List<TeamManager.Team> Teamlist = new List<TeamManager.Team>();

    SqlDependency.Stop(ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString);
   SqlDependency.Start(ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString);

   SqlDataReader reader = null;

   using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString))
   {
       using (var cmd = cn.CreateCommand())
       {
           cmd.CommandType = CommandType.Text;
           cmd.CommandText = "SELECT [TeamID], [Teamnaam], [AantalPersonen],[Eindtijd], [Datum] FROM [Escapehaarlem].[Team]";

           cmd.Notification = null;

           SqlDependency dep = new SqlDependency(cmd);
           dep.OnChange += Dep_OnChange;

           cn.Open();

           reader = cmd.ExecuteReader();

           if (reader.HasRows)
           {
               while (reader.Read())
               {
                   Teamlist.Add(new TeamManager.Team()
                            {
                                TeamID = Convert.ToInt32(reader.GetValue(0)),
                                Teamnaam = reader.GetValue(1).ToString(),
                                AantalPersonen = Convert.ToByte(reader.GetValue(2)),
                                Eindtijd = reader.GetValue(3).ToString(),
                                Datum = Convert.ToDateTime(reader.GetValue(4)),
                            });
                        }
               }

               reader.Close();
           }
       }

       return Teamlist;
   }

   private void Dep_OnChange(object sender, SqlNotificationEventArgs e)
   {
        LeaderboardHub.Show();
   }
}

Это мой хаб шоу выглядит так:

public static void Show()
{
    IHubContext context = GlobalHost.ConnectionManager.GetHubContext<LeaderboardHub>();
    context.Clients.All.displayLeaderBoard();
}

Запуск:

public void Configuration(IAppBuilder app)
{
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888
    app.MapSignalR();
}

И это код, который я использую для Index.cs html:

<div id="body">
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>Leader Board</h1>
            </hgroup>
        </div>
    </section>
    <section class="content-wrapper main-content clear-fix">
        <h1>
            <span>
                Top Challengers
                @*<img src="Images/goals_256.png" style="width:40px; height:60px;" />*@
            </span>
        </h1>
        <table id="tblRank" class="table table-striped table-condensed table-hover"></table>
    </section>
</div>

@section scripts{
    @Scripts.Render("~/Scripts/jquery.signalR-2.4.1.min.js")
    @Scripts.Render("~/signalr/hubs")

    <script type="text/javascript">
        $(function () {
            var rank = $.connection.leaderboardHub;

            rank.client.displayLeaderBoard = function () {
                LoadResult();
            };

            $.connection.hub.logging = true;
            $.connection.hub.start();
            LoadResult();
        });

        function LoadResult() {
            var $tbl = $("#tblRank");
            $.ajax({
                url: 'https://escapehaarlemhighscore.nl/api/game/GetAllteams',
                type: 'GET',
                datatype: 'json',
                success: function (data) {
                    if (data.length > 0) {
                        $tbl.empty();
                        $tbl.append('<thead><tr><th>Rank</th><th></th><th></th><th>Best</th><th>Achieved</th></tr></thead>');
                        var rows = [];
                        for (var i = 0; i < data.length; i++) {
                            rows.push('<tbody><tr><td>' + (i + 1).toString() + '</td><td>' + data[i].Teamnaam + '</td><td>' + data[i].AantalPersonen + '</td><td>' + data[i].Eindtijd + '</td><td>' + data[i].Datum + '</td></tr></tbody>');
                        }
                        $tbl.append(rows.join(''));
                    }
                }
            });
        }
    </script>
}

Надеюсь, кто-нибудь сможет объяснить мне, почему это работает без использования SqlDependency и почему не работает с SqlDependency.

Заранее спасибо

...