在不刷新的情况下,SignalR 不会自动更新 CSHTML



每当数据库中添加新条目时,我都会尝试创建一个带有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函数应该在网站上显示。

此外,这是我用于网站本身的代码CSHTML:

<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>
}

有人能解释一下为什么网站在没有刷新的情况下不会更新,以及如何使其成为可能吗。

编辑

这是我用于集线器的代码:

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

提前感谢

您缺少控制器方法对Hub的实际调用。

只需在阅读器关闭后添加

LeaderboardHub.Show()

为了更好地调试,您可以通过文档添加signalR日志

最新更新