SignalR не будет автоматически обновлять CS HTML без обновления - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать веб-сайт с webapi и signalR всякий раз, когда в базу данных добавляется новая запись.

Но, как следует из названия, новая запись не будет добавлена ​​без обновления сайта. Хотя он показывает запись в базе данных.

[HttpGet]
    public IEnumerable<TeamManager.Team> GetAllTeams()
    {
        List<TeamManager.Team> Teamlist = new List<TeamManager.Team>();
        string mainconn = ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString;
        SqlConnection sqlconn = new SqlConnection(mainconn);
        string sqlquery = "Select * from [Escapehaarlem].[Team]";

        SqlDataReader reader = null;

        SqlDependency.Start(mainconn);

        try
        {
            SqlCommand sqlcomm = new SqlCommand(sqlquery, sqlconn);
            //sqlcomm.CommandType = CommandType.Text;
            sqlconn.Open();

            sqlcomm.Notification = null;

            SqlDependency dependency = new SqlDependency(sqlcomm);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            reader = sqlcomm.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();
        }
        catch
        {

        }
        finally
        {
            if (reader != null) { reader.Close(); }
            sqlconn.Close();
        }
        return Teamlist;
    }

Это код для Webapi, эта функция GET должна отображаться на веб-сайте.

Кроме того, это код, который я использовал для сам сайт 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.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>
}

Может ли кто-нибудь объяснить мне, почему сайт не обновляется без обновления sh и как это сделать.

РЕДАКТИРОВАТЬ

Это код, который я использую для концентратора:

using Microsoft.AspNet.SignalR;

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

Это запуск:

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(GebruikerService.Startup))]

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

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

1 Ответ

0 голосов
/ 06 мая 2020

Вам не хватает фактического вызова Hub из метода контроллера.

просто добавьте после закрытия ридера

LeaderboardHub.Show()

для лучшей отладки вы можете добавить регистрацию signalR с помощью документации

...