public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg,
                                               ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // проверяем, задано ли имя серверного хоста или его адрес
            _serverHostNameOrIp = requestHeaders["serverHostNameOrIp"];
            if (_serverHostNameOrIp != null)
            {
                // помещаем его в контекст вызова
                CallContext.SetData("serverHostNameOrIp", _serverHostNameOrIp);
                // протоколируем
                if (_eventLink != null)
                {
                    _eventLink.Post(_eventSource, string.Format("Имя или IP-адрес сервера ЗАДАНО: [{0}]",
                                                                _serverHostNameOrIp));
                }
            }
            else
            {
                // очишаем значение, оставшееся от предыдущих вызовов
                CallContext.FreeNamedDataSlot("serverHostNameOrIp");
                // протоколируем
                if (_eventLink != null)
                {
                    _eventLink.Post(_eventSource, EventType.Warning, "Имя или IP-адрес сервера НЕ задано");
                }
            }

            // перенаправляем обработку сообщения следующему приемнику в цепи
            sinkStack.Push(this, null);
            ServerProcessing status = _nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders,
                                                               requestStream, out responseMsg, out responseHeaders, out responseStream);

            return(status);
        }
示例#2
0
 /// <summary>
 /// Отсоединение объекта от его прокси
 /// </summary>
 /// <param name="obj">Объект</param>
 public void DisconnectedObject(object obj)
 {
     if (_debugInfo)
     {
         _eventLink.Post(DeviceManager.EventSource,
                         string.Format(_objDisconnected, obj.GetType()));
     }
 }
示例#3
0
        /// <summary>
        /// Создает экземпляр класса
        /// </summary>
        /// <param name="eventLink">Интерфейс журнала событий</param>
        public TsManager(IEventLink eventLink)
        {
            if (eventLink == null)
            {
                throw new ArgumentNullException("eventLink");
            }

            // загружаем реализации логики работы СКУД
            _eventLink = eventLink;
            _eventLink.Post(TsGlobalConst.EventSource, "Загрузка реализаций логики работы СКУД");
            _logicLoader = new AMCSLogicLoader(TsGlobalConst.GetACMSLogicDirectory());

            // загрузка конфигурации
            _eventLink.Post(TsGlobalConst.EventSource, "Загрузка конфигурации менеджера");
            _settings = GenericSerializer.Deserialize <TsManagerSettings>(TsGlobalConst.GetSettingsFile(),
                                                                          false, _logicLoader.GetLogicSettingsTypes());
            _workers = new List <TsWorker>();

            // просматриваем конфигурацию и создаем по рабочему потоку для каждого турникета
            foreach (AMCSLogicSettings logicSettings in _settings.LogicSettings)
            {
                foreach (TsUnitSettings unitSettings in logicSettings.Units)
                {
                    try
                    {
                        // создаем реализацию логики работы СКУД и инициализируем ее параметры
                        IAMCSLogic logic = _logicLoader.CreateLogic(logicSettings.AcmsName);
                        logic.Settings = logicSettings.LogicSettings;

                        // создаем рабочий поток
                        TsWorker worker = new TsWorker(logic, unitSettings, _eventLink);
                        _eventLink.Post(TsGlobalConst.EventSource, string.Format(
                                            "Создан рабочий поток для турникета {0}, СКУД \"{1}\"",
                                            unitSettings, logicSettings.AcmsName));

                        // добавляем его в список
                        _workers.Add(worker);
                    }
                    catch (Exception e)
                    {
                        string checkPoint = string.Format(
                            "Создание рабочего потока для турникета {0}, СКУД \"{1}\"",
                            unitSettings, logicSettings.AcmsName);
                        _eventLink.Post(TsGlobalConst.EventSource, checkPoint, e);
                    }
                }
            }
        }
示例#4
0
        /// <summary>
        /// Захват устройства
        /// </summary>
        private void CaptureDevice()
        {
            if (_client != null && _device != null)
            {
                // устройство уже захвачено
                return;
            }

            // подключаемся к диспетчеру устройств
            _client = new DeviceManagerClient(_unitSettings.HostOrIp, _unitSettings.Port);
            _client.Login();
            // захватываем турникет
            _client.Capture(_unitSettings.DeviceId, Timeout.Infinite);
            _device = (ITurnstileDevice)_client[_unitSettings.DeviceId];
            // подключение установлено
            _eventLink.Post(TsGlobalConst.EventSource, string.Format(
                                "[0] Подключение к диспетчеру устройств установлено", _unitSettings));
        }
        /// <summary>
        /// Замена имени хоста или IP-адреса
        /// </summary>
        /// <param name="dataStore">Данные канала</param>
        /// <param name="serverHostNameOrIp">Имя или адрес хоста, переданное с клиента</param>
        private void ReplaceHostNameOrIp(ChannelDataStore dataStore, string serverHostNameOrIp)
        {
            for (int i = 0; i < dataStore.ChannelUris.Length; i++)
            {
                if (_eventLink != null)
                {
                    _eventLink.Post(EventSource, string.Format(
                                        "Исходный URI в данных канала связи: {0}", dataStore.ChannelUris[i]));
                }

                UriBuilder ub = new UriBuilder(dataStore.ChannelUris[i]);

                // сравниваем имя хоста в URI канала и то же, переданное с клиента
                if (string.Compare(ub.Host, serverHostNameOrIp, true) != 0)
                {
                    // меняем на значение, переданное с клиента
                    ub.Host = serverHostNameOrIp;
                    dataStore.ChannelUris[i] = ub.ToString();

                    if (_eventLink != null)
                    {
                        _eventLink.Post(EventSource, string.Format(
                                            "Хост изменен. Новый URI: {0}", dataStore.ChannelUris[i]));
                    }
                }
            }
        }
示例#6
0
 private void EnumWorkers(string checkPointId, EnumWorkerDelegate workerDelegate)
 {
     foreach (TsWorker worker in _workers)
     {
         try
         {
             workerDelegate(worker);
         }
         catch (Exception e)
         {
             _eventLink.Post(TsGlobalConst.EventSource, checkPointId, e);
         }
     }
 }
        protected CustomProgressReporter(IEventLink eventLink, Mode mode)
        {
            _eventLink = eventLink;
            _mode = mode;
            _startTime = DateTime.Now;

            var message = String.Empty;
            switch (_mode)
            {
                case Mode.Replace:
                    message = _startReplace;
                    break;
                case Mode.Update:
                    message = _startUpdate;
                    break;
                default:
                    message = _startDeletion;
                    break;
            }

            _eventLink.Post(ConstHelper.EventSource, message);
        }
示例#8
0
        /// <summary>
        /// Добавляет запись в протокол работы приложения
        /// </summary>
        /// <param name="message">Текст сообщения</param>
        /// <param name="type">Тип сообщения</param>
        public void WriteEntry(string message, EventLogEntryType type)
        {
            // конвертируем тип события
            // тип EventLogEntryType оставлен для обратной совместимости
            EventType nativeEventType = EventType.Undefined;

            switch (type)
            {
            case EventLogEntryType.Error:
                nativeEventType = EventType.Error;
                break;

            case EventLogEntryType.Information:
                nativeEventType = EventType.Information;
                break;

            case EventLogEntryType.Warning:
                nativeEventType = EventType.Warning;
                break;
            }

            _eventLink.Post(EventSource, nativeEventType, message);
        }