Уведомление об изменении БД Oracle SignalR Удалить регистрацию
В моем проекте я использую уведомление об изменении оракула в моем концентраторе сигналов. Моя клиентская часть разработана на Angular4, а моя серверная часть - ASP.NET web api. когда вызывается функция в сигнальном концентраторе, я должен зарегистрировать уведомление об изменении оракула. когда мой концентратор сигналов отключен, я должен удалить это уведомление об изменении базы данных. для удаления мне нужна переменная OracleDependency с оракулом. но метод OnDisconnected() в сигнализаторе я получаю значение OracleDependency и OracleConnection как ноль. вот почему я не могу удалить регистрацию зависимости от оракула. Каждое приложение генерирует новую регистрацию и каждый раз, когда в базе данных происходят новые изменения, мое приложение получает много уведомлений.
[HubName("batchHub")]
public class BatchProcessHub : Hub
{
public OracleDependency dep = new OracleDependency();
public OracleConnection connection = new OracleConnection();
public override Task OnDisconnected(bool stopCalled)
{
try
{
dep.RemoveRegistration(connection); // dep and connection returns null
}
catch (Exception e)
{
}
return base.OnDisconnected(stopCalled);
}
public void StartBatchMonitoring(string OrgId, string FromDate, string ToDate)
{
try
{
FromDate = FromDate.ToUpper();
ToDate = ToDate.ToUpper();
string monitoringTableSql = "SELECT * FROM BLAH_BLAH";
if (connection == null || connection.State != ConnectionState.Open)
{
connection = new OracleConnection(new OracleEBSEntities().Database.Connection.ConnectionString);
OracleConnection.ClearPool(connection);
connection.Open();
}
OracleCommand cmdTable = new OracleCommand(monitoringTableSql, connection);
cmdTable.AddRowid = true;
dep = new OracleDependency(cmdTable);
dep.QueryBasedNotification = true;
cmdTable.Notification.IsNotifiedOnce = false;
dep.OnChange += BatchMonitoringTableChange;
OracleDataAdapter adapter = new OracleDataAdapter(cmdTable);
DataSet ds = new DataSet();
adapter.Fill(ds, "table");
DataTable dt = ds.Tables["table"];
}
catch (Exception ex)
{
Clients.Caller.BatchMonitoringError("Something wrong during start query execution. Error is = " + ex.Message + " I.Exc. " + ex.InnerException);
}
}
private void BatchMonitoringTableChange(object sender, OracleNotificationEventArgs eventArgs)
{
List<string> rowIdList = new List<string>();
foreach (DataRow dr in eventArgs.Details.Rows)
{
string rowId = dr["rowId"].ToString();
if (rowIdList.IndexOf(rowId) < 0)
{
rowIdList.Add(rowId);
}
}
Clients.All.NotifyItemChanged("table changed.");
}
}