概述:我想为用户输入创建一个带有警报通知的余数。我有一个包含用户名和日期的视图页面。如果提交成功,则应将其存储在数据库中。使用 signalR ,我想在客户端时间(机器时间)和用户输入时间(服务器时间)匹配时触发提醒。它应该给出一个弹出窗口,显示用户名和提醒时间的通知。
说明:
Homepage
Username: textbox
Reminder date and time: textbox
Save reminder: button
用户点击保存提醒,并将时间保存在数据库中。 当当前时间与使用信号R的提醒日期和时间相对应时,显示带有用户名的弹出窗口。
(要检查输出,请在两个不同的浏览器中打开localhost网址,看看弹出窗口是否同时打开。)
答案 0 :(得分:1)
一个好的起点是here,请记住,检查日期是否匹配将需要某种周期性任务(如果您希望将所有内容保存在同一个Web应用程序中,您可以查看{{3} }})
一个简单的方法如下:
<强>集线器强>
如果您有多个服务器或工作流程,则可能必须将SignalR连接与其他地方的用户名之间的映射存储为HangFire。public class ReminderHub : Hub
{
public Dictionary<string,string> _conn = new Dictionary<string,string>();
public void Store(string username, DateTime date)
{
// Store into the database
// ....
// ...
// Store the realation between the connection and the username
_conn.Add(username,Context.ConnectionId);
}
public void Notify(string username)
{
// notify method is defined in the client (js)
Clients.User(_conn[username]).notify(username);
}
}
网络客户端
日期格式和其他详细信息的详细信息将被省略以保持答案简短
var hub = $.connection.reminderHub;
hub.client.notify = function (username) {
alert(username)
};
$.connection.hub.start().done(function () {
// Wire up save reminder option.
$('#save').click(function () {
hub.server.Store($('#username').val(), $('#date').val());
});
});
<强>任务强> 对于周期性任务,您有多个选项,HangFire任务,窗口服务或事件,作为计划任务运行的简单控制台应用程序。
我认为这是一个控制台应用程序。
您将需要here,看看是否正确设置了客户端。
var hubConnection = new HubConnection("**YOUR URL**);
await hubConnection.Start();
IHubProxy proxy = hubConnection.CreateHubProxy("ReminderHub");
// QUERY THE DATABASE Check if there's any user to notify
for(var username in UsersToNotify){
proxy.Invoke("Notify", username);
}
请记住,对我来说有很多改进,这个代码只是简单的方法。