在 Siebel 中神奇地设置配置文件属性
Profile attribute being magically set in Siebel
我们的 Siebel 7.8 应用程序中有一个非常 奇怪的问题。
在Application_Start
事件中我们定义了一堆配置文件属性,这些属性决定了是否允许登录用户执行某些操作。代码是这样的:
if (userHasSuperpowers) {
TheApplication().SetProfileAttr("CanFly", "Y");
} else {
// CanFly is not set, and GetProfileAttr("CanFly") returns ''
}
一切正常,除了这些配置文件属性之一。条件不满足,所以我们不设置它的值。但是当我们使用 GetProfileAttr
检查它时...它 returns '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 推广到我们的测试或生产环境,它会起作用并且 returns 预期值。
- 这不是数据问题:仍然使用相同的 SRF,我可以使用我的本地胖客户端,使用相同的登录名和密码连接到我们的开发数据库,它也工作正常。
- 这不是并发问题:我们只在一个用户登录的情况下进行测试。即使我们有更多用户,他们也不会共享会话。即使他们这样做了,价值也不会总是
'Y'
.
- 这不是临时故障,也不是由于错误的增量编译或损坏的 SRF 造成的:我们已经经历了至少 6 个月的时间(显然,在那个时间范围内,我们有几十个不同的 SRF文件...他们都有同样的问题,但仅在开发中,并且仅当您使用服务器而不是专用客户端时...严重...).
我还能在哪里搜索正在设置的配置文件属性?我读过它们可以持久保存到数据库中,但是为了这样做,您必须定义它们是基于 S_PARTY 扩展 table 的 BC 中的一个字段,对吗?
有没有办法以某种方式跟踪配置文件属性的更改?也许提高一些日志级别?
在加载第一个小程序之前,我如何才能至少找出 Application_Start
之后正在执行的内容?
还有其他想法吗?我也尝试检查 SQL 假脱机文件,但也没有发现任何可疑的东西(即,我们用来检查条件的任何查询,两次使用不同的参数 运行)。
更新:按照 Ranjith R 的建议,我还检查了:
- 也可以从工作流调用以设置配置文件属性的其他普通业务服务:
User Registration > SetProfileAttr
、SessionAccessService > SetProfileAttr
和 ISS Promotion Agreement Manager > SetProfileAttributes
。
- 运行时事件直接设置配置文件属性或使用业务服务(我们没有任何 运行除了原始事件之外的时间事件)。
- 从 DVMs 调用业务服务(我们只有原始数据验证规则,其中 none 适用于我们的总线组件)。
仍然没有运气...
Siebel 7.8 是否有运行时事件?我不记得了。运行时事件有一个为 setevent 设置的操作,它可以 set/clear 配置文件属性。
还有其他普通业务服务可以设置配置文件属性,请尝试在业务服务方法下的工具平面中搜索 *rofile*tt*
。
SIS OM 服务也可以直接从 DVM 调用运行时事件,所以这也是一种可能性。
没有日志系统可以查看配置文件属性值的变化,测试是唯一的出路。
好的...终于我们找到了发生了什么:
- 我们访问 URL 到我们的服务器并进入登录页面。这会为
SADMIN
用户触发第一个 Application_Start
事件。
- 我们在该会话中设置了配置文件属性。
SADMIN
是 Siebel 管理员用户,所以是的,他 hasSuperpowers
因此我们 TheApplication().SetProfileAttr("CanFly", "Y");
.
Application_Start
活动结束。
- 我们在登录屏幕中输入用户名和密码以访问 Siebel。这会触发第二个
Application_Start
事件,这次是针对我们的用户。这是我用跟踪文件监视的文件。
- 我们在新会话中再次设置配置文件属性。我们的用户没有
hasSuperpowers
,所以我们没有为 CanFly
属性设置任何值。
Application_Start
事件结束,CanFly
仍然是空的。
- Siebel 在加载第一个屏幕之前将两个会话合并为一个!!或者至少,它传输了我们为
SADMIN
. 设置的配置文件属性
我确信它会那样发生,原因有二。首先,我们更改了配置文件属性名称以包含用户名。其次,我们现在存储的不是 "Y"
,而是当前日期:
var time = (new Date()).getTime();
TheApplication().SetProfileAttr("CanFly_" + TheApplication().LoginName(), time);
我们最终得到 CanFly_SADMIN
,但没有 CanFly_USER
,并且存储的时间值与我们在步骤 2 的日志文件中看到的相同... *_USER
属性的值。
事情就是这样。我仍然不知道为什么 Siebel 会这样,但这对另一个问题很重要。根据 Siebel bookshelf:
The Start event is called when the client starts and again when the user interface is first displayed.
...但它并没有说明它是从两个不同的会话、不同的用户调用,然后将它们合并在一起的。考虑到它不会发生在其他环境中,这一定是我们开发环境中的配置错误。
我们的 Siebel 7.8 应用程序中有一个非常 奇怪的问题。
在Application_Start
事件中我们定义了一堆配置文件属性,这些属性决定了是否允许登录用户执行某些操作。代码是这样的:
if (userHasSuperpowers) {
TheApplication().SetProfileAttr("CanFly", "Y");
} else {
// CanFly is not set, and GetProfileAttr("CanFly") returns ''
}
一切正常,除了这些配置文件属性之一。条件不满足,所以我们不设置它的值。但是当我们使用 GetProfileAttr
检查它时...它 returns '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 推广到我们的测试或生产环境,它会起作用并且 returns 预期值。
- 这不是数据问题:仍然使用相同的 SRF,我可以使用我的本地胖客户端,使用相同的登录名和密码连接到我们的开发数据库,它也工作正常。
- 这不是并发问题:我们只在一个用户登录的情况下进行测试。即使我们有更多用户,他们也不会共享会话。即使他们这样做了,价值也不会总是
'Y'
. - 这不是临时故障,也不是由于错误的增量编译或损坏的 SRF 造成的:我们已经经历了至少 6 个月的时间(显然,在那个时间范围内,我们有几十个不同的 SRF文件...他们都有同样的问题,但仅在开发中,并且仅当您使用服务器而不是专用客户端时...严重...).
我还能在哪里搜索正在设置的配置文件属性?我读过它们可以持久保存到数据库中,但是为了这样做,您必须定义它们是基于 S_PARTY 扩展 table 的 BC 中的一个字段,对吗?
有没有办法以某种方式跟踪配置文件属性的更改?也许提高一些日志级别?
在加载第一个小程序之前,我如何才能至少找出 Application_Start
之后正在执行的内容?
还有其他想法吗?我也尝试检查 SQL 假脱机文件,但也没有发现任何可疑的东西(即,我们用来检查条件的任何查询,两次使用不同的参数 运行)。
更新:按照 Ranjith R 的建议,我还检查了:
- 也可以从工作流调用以设置配置文件属性的其他普通业务服务:
User Registration > SetProfileAttr
、SessionAccessService > SetProfileAttr
和ISS Promotion Agreement Manager > SetProfileAttributes
。 - 运行时事件直接设置配置文件属性或使用业务服务(我们没有任何 运行除了原始事件之外的时间事件)。
- 从 DVMs 调用业务服务(我们只有原始数据验证规则,其中 none 适用于我们的总线组件)。
仍然没有运气...
Siebel 7.8 是否有运行时事件?我不记得了。运行时事件有一个为 setevent 设置的操作,它可以 set/clear 配置文件属性。
还有其他普通业务服务可以设置配置文件属性,请尝试在业务服务方法下的工具平面中搜索 *rofile*tt*
。
SIS OM 服务也可以直接从 DVM 调用运行时事件,所以这也是一种可能性。
没有日志系统可以查看配置文件属性值的变化,测试是唯一的出路。
好的...终于我们找到了发生了什么:
- 我们访问 URL 到我们的服务器并进入登录页面。这会为
SADMIN
用户触发第一个Application_Start
事件。 - 我们在该会话中设置了配置文件属性。
SADMIN
是 Siebel 管理员用户,所以是的,他hasSuperpowers
因此我们TheApplication().SetProfileAttr("CanFly", "Y");
. Application_Start
活动结束。- 我们在登录屏幕中输入用户名和密码以访问 Siebel。这会触发第二个
Application_Start
事件,这次是针对我们的用户。这是我用跟踪文件监视的文件。 - 我们在新会话中再次设置配置文件属性。我们的用户没有
hasSuperpowers
,所以我们没有为CanFly
属性设置任何值。 Application_Start
事件结束,CanFly
仍然是空的。- Siebel 在加载第一个屏幕之前将两个会话合并为一个!!或者至少,它传输了我们为
SADMIN
. 设置的配置文件属性
我确信它会那样发生,原因有二。首先,我们更改了配置文件属性名称以包含用户名。其次,我们现在存储的不是 "Y"
,而是当前日期:
var time = (new Date()).getTime();
TheApplication().SetProfileAttr("CanFly_" + TheApplication().LoginName(), time);
我们最终得到 CanFly_SADMIN
,但没有 CanFly_USER
,并且存储的时间值与我们在步骤 2 的日志文件中看到的相同... *_USER
属性的值。
事情就是这样。我仍然不知道为什么 Siebel 会这样,但这对另一个问题很重要。根据 Siebel bookshelf:
The Start event is called when the client starts and again when the user interface is first displayed.
...但它并没有说明它是从两个不同的会话、不同的用户调用,然后将它们合并在一起的。考虑到它不会发生在其他环境中,这一定是我们开发环境中的配置错误。