在MVC4中使用SignalR的提醒模型

时间:2015-08-01 10:59:20

标签: c# asp.net asp.net-mvc asp.net-mvc-4 azure

概述:我想为用户输入创建一个带有警报通知的余数。我有一个包含用户名和日期的视图页面。如果提交成功,则应将其存储在数据库中。使用 signalR ,我想在客户端时间(机器时间)和用户输入时间(服务器时间)匹配时触发提醒。它应该给出一个弹出窗口,显示用户名和提醒时间的通知。

说明:

Homepage

Username: textbox

Reminder date and time: textbox

Save reminder: button

用户点击保存提醒,并将时间保存在数据库中。 当当前时间与使用信号R的提醒日期和时间相对应时,显示带有用户名的弹出窗口。

(要检查输出,请在两个不同的浏览器中打开localhost网址,看看弹出窗口是否同时打开。)

1 个答案:

答案 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);

}

请记住,对我来说有很多改进,这个代码只是简单的方法。