【问题标题】:Reminder Model using SignalR in MVC4在 MVC4 中使用 SignalR 的提醒模型
【发布时间】:2015-10-24 00:17:30
【问题描述】:

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

说明:

Homepage

Username: textbox

Reminder date and time: textbox

Save reminder: button

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

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

【问题讨论】:

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


    【解决方案1】:

    一个好的起点是here,请记住,检查日期是否匹配需要某种周期性任务(如果你想将所有内容保存在同一个网络应用程序中,你可以查看HangFire

    一种简单的方法如下所示:

    集线器

    Kepp 说,如果您有多个服务器或工作进程,您可能需要将 SignalR 连接和用户名之间的映射存储在其他地方,请查看 here

    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 任务、窗口服务或事件、作为计划任务运行的简单控制台应用程序。

    我假设这是一个控制台应用程序。

    您将需要.Net SignalR Client,查看客户端的正确设置。

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

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

    【讨论】:

    • 这里使用字典有什么替代品吗?
    • 当然,实际上您可能已经进行了某种身份验证,也许看看here,您可以使用 Redis 或服务状态服务器之类的东西进行映射。
    • 好的。我还有一个疑问。我需要为用户输入显示日期时间控件。我知道 html 5 中有 datetime 输入类型。但是我的浏览器不支持 datetime。那么如何显示日期时间控件呢?
    • 你好,这个问题和原来的问题没有特别的关系。您可以使用jQueryUIKendoUIWijmo 或像Pikaday 这样的轻量级解决方案来使用很多替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    相关资源
    最近更新 更多