SignalR在数据库更新后不会实时更新网站

时间:2015-02-08 19:53:59

标签: c# asp.net-mvc signalr

我正在努力使用SignalR。当我发生对数据库的更改时,我试图让它更新网站的div。我使用了一个工作示例(我尝试过)来了解如何完成这项工作,但由于某种原因,它并不适用于我的项目。

什么不起作用?显然,数据库修改的事件不会触发,但另一个解决方案中的代码(几乎相同)可以正常工作。

这是涉及的代码:

NotificationHub.cs

namespace WebApplication.SignalR
{
    public class NotificationHub : Hub
    {
        public void Hello()
        {
            Clients.All.hello();
        }

        [HubMethodName("show")]
        public static void Show()
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            context.Clients.All.displayStatus();
        }
    }
}

NotificationInfo.cs

namespace WebApplication.SignalR_Data
{
    public class NotificationInfo
    {
        public DateTime Date { get; set; }
        public int RowCount { get; set; }
    }
}

NotificationrRepository.cs - 这是发生事件处理的地方。

namespace WebApplication.SignalR_Data
{
    public class NotificationRepository
    {
        public NotificationInfo GetData()
        {
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ReservationDbContext"].ConnectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(@"SELECT COUNT(*) FROM dbo.Reservations", connection))
                {
                    command.Notification = null;

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

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

                    return new NotificationInfo { RowCount = (int)command.ExecuteScalar(), Date = DateTime.Now };

                }
            }
        }

        public void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if(e.Type == SqlNotificationType.Change)
                NotificationHub.Show();
        }
    }
}

这是View:ReservationHome.cshtml

@{
    ViewBag.Title = "Índice";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<body>

    @RenderPage("~/Views/Shared/_Navbar.cshtml")
    <script src="~/scripts/jquery-2.1.1.min.js"></script>
    <script src="~/scripts/jquery.signalr-2.2.0.min.js"></script>
    <script src="/signalr/hubs"></script>
    <script type="text/javascript">
    $(function () {
        // Declare a proxy to reference the hub.
        var notifications = $.connection.notificationHub;

        //debugger;
        // Create a function that the hub can call to broadcast messages.
        notifications.client.displayStatus = function () {
            getAllMessages();
        };
        // Start the connection.
        $.connection.hub.start().done(function () {
            getAllMessages();
        }).fail(function (e) {
            alert(e);
        });
    });


    function getAllMessages() {
        var div = $('#dbNotifications');
        $.ajax({
            url: '/Reservation/GetUpdate',
            contentType: 'application/html ; charset:utf-8',
            type: 'GET',
            dataType: 'html'
        }).success(function (result) {
            div.empty().append(result);
        }).error(function () {

        });
    }
    </script>



    <div id="wrap">

        <h1>Aplicación de Reserva de Mesas</h1>

        <div id="content">

            <p>En esta aplicación web usted podrá realizar reservas de mesa.</p>

            <div id="dbNotifications"></div>
        </div>

    </div>

</body> 

这是相关的控制器操作(ReservationController.cs

public ActionResult GetUpdate()
{
    NotificationRepository updateRepo = new NotificationRepository();
    return PartialView("_NotificationsCount", updateRepo.GetData());
}

Owin和SignalR有一个启动类,我没有添加它因为我觉得它无关紧要。 Global.asax也有以下几行:

主要问题位于NotificationRepository.cs,由于某种原因,在数据库更改后(例如插入新行),事件似乎没有触发。该存储库中的方法只被调用一次,即页面加载时。

关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

您的事件dependency_OnChange未触发,因为您处置了用于注册SqlConnection的{​​{1}}。它需要保持开放才能举起活动。

不要在using语句中实例化SqlDependency,只需将其分配给变量,并确保在应用程序关闭时将其丢弃,或者在相关时尽快处理。