Атрибут профиля волшебным образом устанавливается в Siebel

У нас возникла очень странная проблема в нашем приложении Siebel 7.8.

В событии Application_Start мы определяем набор атрибутов профиля, которые определяют, разрешено ли зарегистрированному пользователю выполнять определенные операции или нет. Код примерно такой:

if (userHasSuperpowers) {
    TheApplication().SetProfileAttr("CanFly", "Y");
} else {
    // CanFly is not set, and GetProfileAttr("CanFly") returns ''
}

Все работает нормально, кроме одного из этих атрибутов профиля. Условия не выполняются, поэтому мы не устанавливаем его значение. Но когда мы проверяем это с помощью GetProfileAttr... он возвращает 'Y' вместо ''.

Я проверил код. Много. Я везде расставил трассировки и на 100% уверен, что при выполнении последней строки события Application_Start атрибут все еще пуст. Однако в первом событии Applet_Load после входа в систему (в апплете HLS Salutation Applet (HLS Home)) его значение уже изменилось на 'Y'. Почему!!? Я искал везде, но не могу найти нигде, где бы мы проводили SetProfileAttr. Я пока исключил:

  • Каждый браузерный и серверный скрипт для всех наших апплетов, приложений, BC и бизнес-сервисов.
  • Все бизнес-службы времени выполнения (те, которые определены непосредственно в приложении, а не в SRF).
  • Поля бизнес-компонента Personalization Profile.
  • SmartScripts (не то чтобы они имели значение в данном конкретном сценарии, я просто упомянул их, чтобы признать, что вы также можете установить атрибуты профиля).
  • Рабочие процессы: каждый шаг, вызывающий SIS OM PMT Service метод Set Profile Attribute.
  • Siebel волшебным образом устанавливает его значение. Имя атрибута профиля создается на заказ на испанском языке и содержит название нашего проекта и row_id. Я на самом деле не думаю, что Siebel использует то же имя для атрибутов своего профиля :).

Но подождите, это еще не все, самое интересное я оставил напоследок: проблема возникает только в нашей среде разработки!

  • Это не проблема SRF: если мы продвигаем один и тот же SRF в нашу тестовую или производственную среду, он работает и возвращает ожидаемое значение.
  • Это не проблема с данными: все еще с тем же SRF я могу использовать свой локальный толстый клиент, подключаясь к нашей базе данных разработки с тем же логином и паролем, и он тоже отлично работает.
  • Это не проблема параллелизма: мы тестируем только одного пользователя, вошедшего в систему. И даже если бы у нас было больше, они не разделяли бы сеансы. И даже если бы они это сделали, значение не всегда было бы 'Y'.
  • Это не временный сбой или что-то из-за неправильной инкрементной компиляции или поврежденного SRF: мы наблюдаем это в течение как минимум 6 месяцев (очевидно, за это время у нас были десятки различных файлов SRF... все у них такая же проблема, но только в разработке, и только если вы используете сервер, а не выделенный клиент... серьезно...).

Где еще я могу искать установленный атрибут профиля? Я читал, что они могут быть сохранены в БД, но для этого вы должны определить их как поле в BC на основе на таблице расширения S_PARTY, верно?

Есть ли способ как-то отследить изменения атрибутов профиля? Может быть, поднять какой-то лог-уровень?

Как я могу узнать хотя бы то, что выполняется после Application_Start, до загрузки первого апплета?

Любые другие идеи? Я также пытался проверить файл спула SQL, но не нашел там ничего подозрительного (т. е. любой из запросов, которые мы используем для проверки условий, выполняется дважды с разными параметрами).


Обновление: следуя предложениям Ранджита Р., я также проверил:

  • Другие ванильные бизнес-службы, которые также можно вызывать из рабочего процесса для установки атрибута профиля: User Registration > SetProfileAttr, SessionAccessService > SetProfileAttr и ISS Promotion Agreement Manager > SetProfileAttributes.
  • События времени выполнения, устанавливающие атрибуты профиля напрямую или с помощью бизнес-сервиса (у нас нет никаких событий времени выполнения, кроме ванильных).
  • Бизнес-сервисы вызываются из DVM (у нас есть только стандартная проверка данных правила, и ни одно из них не применимо к нашим шинным компам).

Все равно не повезло...


person AJPerez    schedule 08.08.2016    source источник


Ответы (2)


Хорошо... наконец мы нашли, что происходит:

  1. Мы обращаемся к URL-адресу нашего сервера и попадаем на страницу входа. Это запускает первое событие Application_Start для пользователя SADMIN.
  2. Мы устанавливаем атрибуты профиля в этом сеансе. SADMIN — это пользователь-администратор Siebel, так что да, он hasSuperpowers, поэтому мы делаем TheApplication().SetProfileAttr("CanFly", "Y");.
  3. Событие Application_Start завершается.
  4. Мы вводим свое имя пользователя и пароль на экране входа в систему, чтобы получить доступ к Siebel. Это запускает второе событие Application_Start, на этот раз для нашего пользователя. Это тот, который я отслеживал с помощью файлов трассировки.
  5. Мы снова устанавливаем атрибуты профиля в новом сеансе. Наш пользователь не использует hasSuperpowers, поэтому мы не устанавливаем никакого значения для атрибута CanFly.
  6. Событие Application_Start завершается, а CanFly все еще пусто.
  7. Siebel объединяет оба сеанса в один перед загрузкой первого экрана!! Или, по крайней мере, он передает атрибуты профиля, которые мы установили для SADMIN.

Я уверен, что так бывает по двум причинам. Во-первых, мы изменили имя атрибута профиля, чтобы оно также включало имя пользователя. И во-вторых, вместо того, чтобы хранить просто "Y", мы теперь сохраняем текущую дату:

var time = (new Date()).getTime();
TheApplication().SetProfileAttr("CanFly_" + TheApplication().LoginName(), time);

В итоге у нас есть CanFly_SADMIN, но нет CanFly_USER, а сохраненное значение времени такое же, как мы видим в файле журнала для шага 2..., которое меньше, чем любое из значений для атрибутов *_USER.

Вот что происходит. Я до сих пор не знаю, почему Siebel ведет себя таким образом, но это уже другой вопрос. Согласно книжной полке Siebel:

Событие Start вызывается при запуске клиента и снова при первом отображении пользовательского интерфейса.

... но он ничего не говорит о том, что он вызывается из двух разных сеансов, разных пользователей, а затем объединяет их вместе. Это должно быть что-то неправильно настроено в нашей среде разработки, учитывая, что этого не происходит в других.

person AJPerez    schedule 09.08.2016
comment
Это потрясающая находка! Значит, для каждого входа пользователя существует один логин SADMIN? Странный. Используете ли вы LDAP или какую-либо другую аутентификацию без базы данных? Может быть, это часть этого. Но эта информация означает, что нам нужно быть более осторожными при использовании имени входа в событиях запуска приложения. Спасибо за продолжение. - person Ranjith R; 09.08.2016
comment
Но @AJPerez, ты сказал, что проблема только в DEV. Так что же происходит в других средах? - person Ranjith R; 10.08.2016
comment
Теперь, когда вы упомянули об этом, да, аутентификация для этой среды отличается — она использует БД, а другие полагаются на Active Directory. Я не знаю, что происходит в других средах, мы никогда раньше не включали трассировку для App_Start. Единственное, что я знаю, это то, что атрибуты профиля были перепутаны только в dev. Я думал, что это может быть что-то неправильно настроено, но, возможно, это просто метод аутентификации. - person AJPerez; 10.08.2016

Есть ли в Siebel 7.8 события времени выполнения? Я не могу вспомнить. Для событий среды выполнения установлено действие для setevent, которое может устанавливать/очищать атрибуты профиля.

Есть еще другие ванильные бизнес-сервисы, которые могут устанавливать атрибуты профиля, попробуйте выполнить поиск в инструментах в разделе «Методы бизнес-сервиса» для *rofile*tt*.

Служба SIS OM также может быть вызвана из DVM для событий RunTime напрямую, так что это тоже возможно.

Не существует системы регистрации изменений значений атрибутов профиля, единственным выходом является тестирование.

person Ranjith R    schedule 08.08.2016
comment
Спасибо, Ранджит. Да, у него есть события времени выполнения, я их сейчас проверял, но у нас есть только ванильные события и наборы действий. попробую другие ваши предложения - person AJPerez; 08.08.2016