SignalR数据库更新通知

时间:2016-03-20 05:42:14

标签: asp.net-mvc-5 signalr jquery-ajaxq

我正在asp.net mvc 5中开发一个应用程序。在这个项目中,我使用signalR来实时显示更新的数据。这意味着当任何数据发生变化时,它将在应用程序UI中加载。但不幸的是,除非我刷新页面,否则它不会自动加载。

以下是我的代码:

Hub :

[HubName("statusLog")]
public class StatusLogHub : Hub
{

    [HubMethodName("sendExportStatus")]
    public void SendExportStatus()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>();
        Clients.All.updateStatus();
    }
}

Repository :

public class EmailStatusLogRepository
{

    readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

    public IEnumerable<EmailStatusLog> GetExportStatus()
    {
        var messages = new List<EmailStatusLog>();
        using (var connection = new SqlConnection(_connString))
        {
            connection.Open();
            using (var command = new SqlCommand(@"SELECT * FROM dbo.EmailStatusLogs WHERE ExportStatus = 1 AND CAST(CONVERT(VARCHAR,Date,101) AS DATETIME)=CAST(CONVERT(VARCHAR,'" + DateTime.Now.Date.ToString("MM/dd/yyyy") + @"',101) AS DATETIME)", connection))
            {
                command.Notification = null;

                var dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                var reader = command.ExecuteReader();

                while (reader.Read())
                {
                    messages.Add(item: new EmailStatusLog { Id = (int)reader["Id"], Investor_Code = (string)reader["Investor_Code"], EmailId = reader["EmailId"] != DBNull.Value ? (string)reader["EmailId"] : "", Date = (string)reader["Date"], ReportName = (string)reader["ReportName"], ExportStatus = (bool)reader["ExportStatus"], EmailSendStatus = (bool)reader["EmailSendStatus"], IsActive = (bool)reader["IsActive"] });
                }
            }

        }
        return messages;
    }
    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            StatusLogHub statusLogHub = new StatusLogHub();
            statusLogHub.SendExportStatus();
        }
    }

}

//Code from where I am updating DB:

public void ExportStatus()
    {
        List<EmailStatusLog> lstEmailStatusLog = new List<EmailStatusLog>();
        EmailStatusLog objEmailStatusLog = new EmailStatusLog();
        foreach (var emailItem in lstEmailReceipent)
        {
            EMailDBContext _ctx = new EMailDBContext();
            objEmailStatusLog.EmailId = emailItem.stEmailAdd;
            objEmailStatusLog.Investor_Code = emailItem.stInvestor_code;
            objEmailStatusLog.Date = DateTime.Now.ToString("MM/dd/yyyy");
            objEmailStatusLog.ReportName = reportName;
            objEmailStatusLog.ExportStatus = IsSuccess;
            objEmailStatusLog.EmailSendStatus = false;
            objEmailStatusLog.IsActive = true;
            _ctx.emailStatusLogs.Add(objEmailStatusLog);
            _ctx.SaveChanges();
            //StatusLogHub objStatusLogHub = new StatusLogHub();
            //objStatusLogHub.SendExportStatus();

        }
    }

Controller :

public ActionResult GetExportStatus()
    {
        EmailStatusLogRepository objEmailStatusRepository = new EmailStatusLogRepository();
        return PartialView("_exportedReportList", objEmailStatusRepository.GetExportStatus());
    }

Javascript: 

<script type="text/javascript" language="javascript">
//==================signalR
$(function () {
    var hub = $.connection.statusLog;
    hub.client.updateStatus = function () {
        getExportStatus()
    };
    $.connection.hub.start().done(function () {
        alert("connection started");
        // hub.server.sendExportStatus($('').val());
        getExportStatus();
    }).fail(function (e) {
        alert(e);
    });
});


function getExportStatus() {
    var tbl = $('#statusTable');
    $.ajax({
        url: '@Url.Action("GetExportStatus")',
        contentType: 'application/html ; charset:utf-8',
        type: 'GET',
        dataType: 'html'
    }).success(function (result) {
        tbl.empty().append(result);
    }).error(function () {

    });
}

2 个答案:

答案 0 :(得分:0)

您需要更改客户端脚本和集线器类方法。 在hub方法中,您需要将GetExportStatus方法作为参数传递,以便集线器将数据发送到所有客户端:

[HubName("statusLog")]
public class StatusLogHub : Hub
{

    [HubMethodName("sendExportStatus")]
    public void SendExportStatus()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>();
        EmailStatusLogRepository el = new EmailStatusLogRepository();
                Clients.All.updateStatus(el.GetExportStatus());
    }
}

在客户端:

$(function()
        {
            var hub = $.connection.statusLog;
            hub.client.updateStatus = function(data) {
//data contain all the data from repository this will call every time as repository updated
                getExportStatus(data)
           };
    $.connection.hub.start().done(function() {
                //alert("connection started");
                hub.server.sendExportStatus();
            }).fail(function(e) {
                alert(e);
            });
        });


function getExportStatus(data)
        {
alert(data);
            //you can put here logic for getting data on html.
    }
}

您可以参考以下链接进行跨域: enter link description here

答案 1 :(得分:0)

您可以尝试使用客户端脚本:

$(function()
        {
            var hubstatusLog = $.connection.statusLog;
            hubstatusLog.client.updateStatus = function(data) {
//data contain all the data from repository this will call every time as repository updated
                getExportStatus(data)
           };
   $.connection.hub.start(function () {
hubstatusLog.server.sendExportStatus();
});
});

function getExportStatus(data)
        {
alert(data);
            //you can put here logic for getting data on html.
    }

服务器中心:

    [HubName("statusLog")]
public class StatusLogHub : Hub
{

    [HubMethodName("sendExportStatus")]
    public void SendExportStatus()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<StatusLogHub>();
        EmailStatusLogRepository el = new EmailStatusLogRepository();
                Clients.All.updateStatus(el.GetExportStatus());
    }
}