【发布时间】:2017-11-14 22:52:35
【问题描述】:
简介:
末尾有一个TL;DR(:
我有两个版本的 Web 应用程序,它们使用 SQL 依赖项和 SignalR 在检测到数据库更改时自动刷新视图。
以前版本的应用程序可以正常工作,而新版本不能。 奇怪的是,乍一看,两个版本的代码相同,两个网络应用之间的 SignalR 部分没有变化。
- 这可能是什么?
- 还有什么我应该记住但我忘记的吗?
- 怎么可能导致数据库发生变化时负责触发刷新事件的代码没有触发该事件?
NotifierEntity.cs:
当你启动应用程序时,两个版本都在后端正确执行以下代码:
void RegisterForNotifications()
{
using (var sqlConnection = new SqlConnection(notificationEntity.SqlConnectionString))
using (var sqlCommand = new SqlCommand(notificationEntity.SqlQuery, sqlConnection))
{
foreach (var sqlParameter in notificationEntity.SqlParameters)
sqlCommand.Parameters.Add(sqlParameter);
sqlCommand.Notification = null;
var sqlDependency = new SqlDependency(sqlCommand);
sqlDependency.OnChange += OnSqlDependencyChange;
if (sqlConnection.State == ConnectionState.Closed)
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
sqlCommand.Parameters.Clear();
}
}
注意:新版本中的OnChangeevent 永远不会触发。
我要刷新的视图:
我要自动刷新的视图包含以下脚本,其作用是订阅数据库中更改表的事件。
和上面的代码一样,这个代码在两个版本之间是相同的的网络应用程序。
<script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Scripts/anotherScript.min.js"></script>
<script type="text/javascript">
var signalRHubInitialized2 = false;
$(function () {
InitializeSignalRHubStore2();
});
function InitializeSignalRHubStore2() {
if (signalRHubInitialized2)
return;
try {
var clientHub2 = $.connection.hubNotificacion;
clientHub2.client.updateTableVehicles = function (message) {
if (message === "Refresh")
ReloadIndexPartial2();
};
$.connection.hub.start().done(function () {
clientHub2.server.initializeTableDependencyVehicles();
signalRHubInitialized2 = true;
});
} catch (err) {
signalRHubInitialized2 = false;
}
};
function ReloadIndexPartial2() {
location.reload();
}
</script>
枢纽:
当您加载视图并运行该脚本时,将在后端访问以下中心代码。代码的第一部分似乎在两个版本的 Web 应用程序中都可以正常工作:
public void InitializeTableDependencyVehicles()
{
if (!flag)
{
using (var db = new ApplicationDbContext())
{
string data = db.GetNotifierEntity<Vehicle>(db.Vehicles).ToJson();
NotifierEntity NotifierEntity1 = NotifierEntity.FromJson(data);
Action<String> dispatcher = (t) => { DispatchToClientTablesVehicles(); };
PushSqlDependency.Instance(NotifierEntity1, dispatcher);
flag = true;
}
}
}
但第二个代码仅在网络应用程序的一个版本上自动运行。当数据库中的记录更新时,另一个版本似乎不会触发刷新事件。请记住,肉眼看来,两个 Web 在 SignalR 和 SQL 依赖部分中的代码相同。
public void DispatchToClientTablesVehicles()
{
Clients.All.updateTableVehicles("Refresh");
}
TL;DR
同一个网络应用的两个版本具有相同的代码,但是网络应用的一个版本检测到数据库中的更改并触发一个事件,而另一个版本则没有。
两个 Web 应用程序运行相同的代码(SignalR 和 SQL 依赖项)
一个 Web 应用程序会自动刷新视图,但另一个不会。
谁能帮我解决这个问题?
【问题讨论】:
-
您需要调试:查找客户端错误、网络错误,尝试创建MCVE。
-
@mason 我已经调试过代码,新版本中的
OnChange事件永远不会触发。我无法调试 数据库池,因为它不是我的代码的一部分。 -
您确定
OnChange事件处理程序已连接吗?您确定它正在查看正确的数据库吗?您是否确保更改了正确的表格/视图?这些是我正在谈论的调试步骤。当某些东西不起作用时,您会检查链条的所有部分,直到找出它停止工作的确切位置。 -
您是在两个应用程序中使用相同的数据库还是它们不同?
-
@mason 是的,
OnChange事件处理程序确实链接正确,它指向正确的数据库并且数据库中修改的表是正确的。
标签: c# asp.net sql-server signalr signalr-hub