Уведомление об изменении БД 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.");

    } 
}

0 ответов

Другие вопросы по тегам