我的页面上有一个通知按钮,表示当前正在等待用户的通知数量。
我认为我可以正确使用SignalR,因为我希望打开一个连接,定期检查此通知计数的更新,然后更新DOM。
我希望我可以使用SignalR执行以下操作,但我不知道如何定期检查更改。
我认为我使用以下代码是正确的:
SignalR Hub
[Authorize]
public class NotificationHub : Hub
{
private IQuizEntities DbContext;
public NotificationHub(IQuizEntities dbContext)
{
this.DbContext = dbContext;
}
public void GetNotificationCount()
{
int userId = Context.User.Identity.GetUserId<int>();
// Get the notification count for the logged in user
int notificationCount = (from notification in this.DbContext.EntitySet<Notification>()
where notification.UserId == userId
select notification).Count();
// If there are any notificatoins, inform the client
if (notificationCount > 0)
{
Clients.Caller.updateNotificationCount(notificationCount);
}
}
}
使用Javascript:
function NotificationHeartbeat() {
var notificationHubProxy = $.connection.notificationHub;
notificationHubProxy.client.updateNotificationCount = function (notificationCount) {
$('span#notification_count').html(notificationCount);
// Change colour of button
if (notificationCount < 1) {
$('#notification_button').removeClass('notification_button_active');
} else {
$('#notification_button').addClass('notification_button_active');
}
};
// Start the connection
$.connection.hub.start().done(function () {
// Do something
});
}
但遗憾的是它永远不会更新DOM ...我认为SignalR可以用来定期对服务器进行长时间轮询?
我注意到我的用例和我见过的另一个用例之间的区别在于,当一个请求来自另一个用户做某事时,SignalR会发出信号。我不想这样做,我只是希望我的服务器定期检查通知的数量,就像任何其他休息服务一样。也许我应该在ajax中使用长轮询。