/// <summary> /// Метод синхронизации /// </summary> /// <param name="aLinkSyncServiceEntitiesId"></param> /// <param name="aIsFullSync"></param> /// <returns></returns> public static string EntitySync(double aLinkSyncServiceEntitiesId, bool aIsFullSync = false) { var beginArgument = new SyncEventArgument {Exception = null, Result = aLinkSyncServiceEntitiesId}; OnBeginSync(beginArgument); _logger.Trace("EntitySync: Начата синхронизация: {0}", aLinkSyncServiceEntitiesId); LinkSyncServEntId = aLinkSyncServiceEntitiesId; IsFullSync = aIsFullSync; var lResult = string.Empty; try { using (var lData = new SyncServicesEntities(GetConnectionString())) { lData.Connection.Open(); try { var lSyncDateTime = lData.GET_SYSDATE(); _syncParams = lData.GetSyncServiceData(aLinkSyncServiceEntitiesId); if (_syncParams == null) { var ex = new NullReferenceException(lResult); OnEndSync(new SyncEventArgument{Exception =ex,Result = lResult}); return lResult; } var lIteratorNumber = 1; var lErrorMsg = string.Empty; var lJSonElements = string.Empty; int lSyncResult; do { switch (Convert.ToInt16(lData.GetLinkSyncServEntData(aLinkSyncServiceEntitiesId, lIteratorNumber, ref lJSonElements, ref lErrorMsg))) { case 0: // ошибка lSyncResult = 0; lResult = lErrorMsg; break; case 1: // успешное получение данных. lSyncResult = 1; if (lJSonElements != string.Empty) { // успешное получение данных. данные не пустые. запускаем синхронизацию // формируем данные для передачи на филиал var lInData = new USInServiceValues { EntityTypeId = _syncParams.ElsysTypeId, JsonEntityData = Convert.ToString(lJSonElements) }; // серриализация данных для передачи на филиал var lJsonInData = JsonConvert.SerializeObject(lInData); _logger.Trace("EntitySync: Кодировка на клиенте {0}", Encoding.Default.EncodingName); // создаем поток который будет передан на филиал var DBEncoding = Encoding.GetEncoding(Properties.Settings.Default.DBEncodingName); var TransmissionEncoding = Encoding.GetEncoding(Properties.Settings.Default.TransmissionEncodingName); _logger.Trace("EntitySync: Кодировка на базе {0}", DBEncoding.EncodingName); _logger.Trace("EntitySync: Кодировка передачи {0}", TransmissionEncoding.EncodingName); using (var ms = new MemoryStream(Encoding.Convert(DBEncoding, TransmissionEncoding, DBEncoding.GetBytes(lJsonInData)))) { var lBinding = new TcpChunkingBinding { OpenTimeout = Properties.Settings.Default.OpenTimeout, ReceiveTimeout = Properties.Settings.Default.ReceiveTimeout, SendTimeout = Properties.Settings.Default.SendTimeout, CloseTimeout = Properties.Settings.Default.CloseTimeout }; var endPointAdress = _syncParams.EndPointAddress; //endPointAdress = string.Empty; using (var factory = new ChannelFactory<IUSExService>(lBinding, new EndpointAddress(endPointAdress))) { try { var service = factory.CreateChannel(); var lRetValuesStr = service.EntitySync(ms); factory.Close(); var lRetValues = JsonConvert.DeserializeObject<USInServiceRetValues>(lRetValuesStr); lSyncResult = Convert.ToInt16(lRetValues.Result); lResult = lRetValues.ErrorMessage; } catch (Exception e) { lResult = string.Format("EntitySync: Синхронизация LinkSyncServiceEntitiesId = {0} закончилась с ошибкой. Ошибка: {1}", aLinkSyncServiceEntitiesId, e); OnErrorSync(new SyncEventArgument {Exception = e,Result = lResult}); continue; } factory.Abort(); } ms.Close(); } } break; case 2: // ошибки не было но данные не были получены lSyncResult = 2; lResult = lErrorMsg; OnErrorSync(new SyncEventArgument {Exception = null,Result = lResult}); continue; //break; default: lSyncResult = 0; lResult = string.Format("EntitySync: Синхронизация LinkSyncServiceEntitiesId = {0} закончилась с ошибкой. Не прогнозируемый результат получения данных", aLinkSyncServiceEntitiesId); OnErrorSync(new SyncEventArgument {Exception = null,Result = lResult}); continue; //break; } lIteratorNumber += 1; } while ((lSyncResult == 1) && (lJSonElements != string.Empty)); switch (lSyncResult) { case 0: var s0 = string.Format("Ошибка при синхронизация сущности EntitySync: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}; Ошибка {5}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName, lResult); OnEndSync(new SyncEventArgument {Exception = null,Result = s0}); break; case 1: lData.SET_LINK_SYNC_SERV_CALL_DATA(Convert.ToDecimal(LinkSyncServEntId), lSyncDateTime); var s1 =string.Format("Успешная синхронизация сущности EntitySync: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName); OnEndSync(new SyncEventArgument {Exception = null,Result = s1}); break; case 2: var s2 = string.Format("Cинхронизация сущности EntitySync не завершена: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}. Причина {5}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName, lResult); OnEndSync(new SyncEventArgument {Exception = null,Result = s2}); lResult = string.Empty; break; } } finally { lData.Connection.Close(); lData.Dispose(); } } } catch (Exception e) { lResult = string.Format("EntitySync: Синхронизация LinkSyncServiceEntitiesId = {0} закончилась с ошибкой. Ошибка: {1}", aLinkSyncServiceEntitiesId, e); OnErrorSync(new SyncEventArgument {Exception = e,Result = lResult}); } OnEndSync(new SyncEventArgument {Exception = null,Result = aLinkSyncServiceEntitiesId}); return lResult; }
public string EntitySync(double aLinkSyncServiceEntitiesId, bool aIsFullSync = false) { this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, "EntitySync: Начата синхронизация: {0}", aLinkSyncServiceEntitiesId); LinkSyncServEntId = aLinkSyncServiceEntitiesId; IsFullSync = aIsFullSync; string lResult = string.Empty; try { using (var lData = new SyncServicesEntities(GetConnectionString())) { lData.Connection.Open(); try { var lSyncDateTime = lData.GET_SYSDATE(); _syncParams = lData.GetSyncServiceData(aLinkSyncServiceEntitiesId); if (_syncParams == null) { lResult = string.Format("EntitySync: aLinkSyncServiceEntitiesId = {0} параметры синхронизации не определены", aLinkSyncServiceEntitiesId); this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, lResult); return lResult; } this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, "EntitySync: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName); int lIteratorNumber = 1; var lErrorMsg = string.Empty; var lJSonElements = string.Empty; int lSyncResult = 0; do { this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} данные по сущности получены и сериализованы. Шаг {1}", aLinkSyncServiceEntitiesId, lIteratorNumber); switch (Convert.ToInt16(lData.GetLinkSyncServEntData(aLinkSyncServiceEntitiesId, lIteratorNumber, ref lJSonElements, ref lErrorMsg))) { case 0: // ошибка lSyncResult = 0; lResult = lErrorMsg; break; case 1: // успешное получение данных. lSyncResult = 1; if (lJSonElements != string.Empty) { // успешное получение данных. данные не пустые. запускаем синхронизацию // формируем данные для передачи на филиал var lInData = new USInServiceValues { EntityTypeId = _syncParams.ElsysTypeId, JsonEntityData = Convert.ToString(lJSonElements) }; // серриализация данных для передачи на филиал string lJsonInData = Newtonsoft.Json.JsonConvert.SerializeObject(lInData); if (Properties.Settings.Default.NeedLogSyncData) { this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} lJsonInData сформирован = {1}", aLinkSyncServiceEntitiesId, lJsonInData); } lInData = null; this.WriteLog(USLogLevel.Trace, "EntitySync: Кодировка на клиенте {0}", Encoding.Default.EncodingName); // создаем поток который будет передан на филиал var DBEncoding = Encoding.GetEncoding(Properties.Settings.Default.DBEncodingName); var TransmissionEncoding = Encoding.GetEncoding(Properties.Settings.Default.TransmissionEncodingName); this.WriteLog(USLogLevel.Trace, "EntitySync: Кодировка на базе {0}", DBEncoding.EncodingName); this.WriteLog(USLogLevel.Trace, "EntitySync: Кодировка передачи {0}", TransmissionEncoding.EncodingName); using (var ms = new MemoryStream(Encoding.Convert(DBEncoding, TransmissionEncoding, DBEncoding.GetBytes(lJsonInData)))) { this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} MemoryStream создан", aLinkSyncServiceEntitiesId); lJsonInData = String.Empty; var lBinding = new TcpChunkingBinding(); lBinding.OpenTimeout = Properties.Settings.Default.OpenTimeout; lBinding.ReceiveTimeout = Properties.Settings.Default.ReceiveTimeout; lBinding.SendTimeout = Properties.Settings.Default.SendTimeout; lBinding.CloseTimeout = Properties.Settings.Default.CloseTimeout; this.WriteLog(USLogLevel.Trace, "lBinding params lBinding.OpenTimeout = {0}; lBinding.ReceiveTimeout = {1}; lBinding.SendTimeout = {2}; lBinding.CloseTimeout = {3}", lBinding.OpenTimeout, lBinding.ReceiveTimeout, lBinding.SendTimeout, lBinding.CloseTimeout); using (var factory = new ChannelFactory<IUSExService>(lBinding, new EndpointAddress(_syncParams.EndPointAddress))) { try { this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} ChannelFactory created", aLinkSyncServiceEntitiesId); IUSExService service = factory.CreateChannel(); this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} IUSExService service = factory.CreateChannel created", aLinkSyncServiceEntitiesId); var lRetValuesStr = service.EntitySync(ms); this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} service.EntitySync выполнен", aLinkSyncServiceEntitiesId); factory.Close(); this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} ChannelFactory Closed", aLinkSyncServiceEntitiesId); this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} Returned Value Deserialized", aLinkSyncServiceEntitiesId); var lRetValues = Newtonsoft.Json.JsonConvert.DeserializeObject<USInServiceRetValues>(lRetValuesStr); lSyncResult = Convert.ToInt16(lRetValues.Result); lResult = lRetValues.ErrorMessage; } catch (Exception e) { lResult = string.Format("EntitySync: Синхронизация LinkSyncServiceEntitiesId = {0} закончилась с ошибкой. Ошибка: {1}", aLinkSyncServiceEntitiesId, e); this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, lResult, e); this.WriteLogException(lResult, e); } factory.Abort(); } } } break; case 2: // ошибки не было но данные не были получены lSyncResult = 2; lResult = lErrorMsg; break; default: lSyncResult = 0; lResult = string.Format("EntitySync: Синхронизация LinkSyncServiceEntitiesId = {0} закончилась с ошибкой. Не прогнозируемый результат получения данных", aLinkSyncServiceEntitiesId); break; } lIteratorNumber += 1; } while ((lSyncResult == 1) && (lJSonElements != string.Empty)); switch (lSyncResult) { case 0: this.WriteLog(USLogLevel.Trace | USLogLevel.Debug | USLogLevel.Error, "Ошибка при синхронизация сущности EntitySync: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}; Ошибка {5}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName, lResult); break; case 1: lData.SET_LINK_SYNC_SERV_CALL_DATA(Convert.ToDecimal(LinkSyncServEntId), lSyncDateTime); this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, "Успешная синхронизация сущности EntitySync: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName); break; case 2: this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, "Cинхронизация сущности EntitySync не завершена: aLinkSyncServiceEntitiesId = {0} Описание {1}; Сущность {2}: {3}; Филиал {4}. Причина {5}", aLinkSyncServiceEntitiesId, _syncParams.Description, _syncParams.ElsysTypeId, _syncParams.ElsysTypeName, _syncParams.BranchName, lResult); lResult = string.Empty; break; default: break; } } finally { lData.Connection.Close(); this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} Соединение закрыто", aLinkSyncServiceEntitiesId); lData.Dispose(); this.WriteLog(USLogLevel.Trace, "EntitySync: aLinkSyncServiceEntitiesId = {0} lData.Dispose done", aLinkSyncServiceEntitiesId); } } } catch (Exception e) { lResult = string.Format("EntitySync: Синхронизация LinkSyncServiceEntitiesId = {0} закончилась с ошибкой. Ошибка: {1}", aLinkSyncServiceEntitiesId, e); this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, lResult, e); this.WriteLogException(lResult, e); } this.WriteLog(USLogLevel.Trace | USLogLevel.Debug, "EntitySync: Завершена синхронизация: {0}", aLinkSyncServiceEntitiesId); return lResult; }