我正在努力使用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,由于某种原因,在数据库更改后(例如插入新行),事件似乎没有触发。该存储库中的方法只被调用一次,即页面加载时。
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
您的事件dependency_OnChange
未触发,因为您处置了用于注册SqlConnection
的{{1}}。它需要保持开放才能举起活动。
不要在using语句中实例化SqlDependency
,只需将其分配给变量,并确保在应用程序关闭时将其丢弃,或者在相关时尽快处理。