【问题标题】:Sharing data across Sitecore pipelines跨 Sitecore 管道共享数据
【发布时间】:2014-04-21 09:02:09
【问题描述】:

我正在尝试仅在必要时在管道“httpRequestBegin”中执行一些操作。 我的处理器在 Sitecore 解析用户后执行(处理器类型 =“Sitecore.Pipelines.HttpRequest.UserResolver, Sitecore.Kernel”),因为如果 Sitecore 无法先解析它,我也在解析用户。

稍后,我想在管道“insertRenderings”中添加一些渲染,前提是执行了前一个管道中的操作(如果我解决了用户,显示一条消息),所以我试图保存一些“标志”第一步,检查第二步。 我的问题是,我在哪里可以存储该标志?我正在尝试找到某种“按请求”缓存...

到目前为止,我已经尝试过:

  • 会话:错误,太早了,会话还不存在。
  • Items (HttpContext.Current.Items):它也不起作用,我的项目在第二步没有。

到目前为止,我正在使用带有一些唯一键的应用程序缓存 (HttpContext.Current.Cache),但我不喜欢这种解决方案。

有人知道分享这个“旗帜”的更好方法吗?

【问题讨论】:

  • 您能否更新您的问题以充实您在 httpRequestBegin 中所做的事情?另外,您的处理器在 httpRequestBegin 的哪个位置出现?
  • 问题已更新。在执行完 sitecore 用户解析后,我正在解析用户。
  • 您能否通过检查插入渲染处理器中的活动用户(可能是他们的域或角色)来解决问题?
  • 用户属性上没有任何内容告诉我是“我”解决了它还是 sitecore 解决了。我曾考虑向配置文件添加一些属性,但我不喜欢将其物理存储在核心数据库中的想法。你知道是否可以将属性保存在内存中并在以后重用它们?
  • 尝试使用Sitecore.Context.Items 收藏。

标签: sitecore


【解决方案1】:

您可以在请求标头中添加一个标志,然后检查它是否存在于后面的管道中,例如

// in HttpRequest pipeline
HttpContext.Current.Request.Headers.Add("CustomUserResolve", "true");

// in InsertRenderings pipeline
var customUserResolve = HttpContext.Current.Request.Headers["CustomUserResolve"];
if (Sitecore.MainUtil.GetBool(customUserResolve, false))
{
    // custom logic goes here
}

这感觉有点有点脏,我认为添加到Request.QueryStringRequest.Params 会更好,但这些都是只读的。但是,如果您只需要一次性交易(即仅第一次解决),那么它将起作用,因为在下一个请求中,标头将恢复为默认值,而无需添加您的自定义标头。

【讨论】:

  • 我认为这是你最好的选择。问题是您可以使用的所有其他存储(我能想到的)在应用程序之间共享,因此不会为请求隔离。 (ab) 使用请求标头效果很好。
【解决方案2】:

HttpContext.Current.CacheHttpRuntime.Cache 可能是这里最快的解决方案。虽然这种方法在 AppPool 被回收时不会保留数据。 如果您只将几个键添加到缓存中然后维护它们,那么此解决方案可能适合您。如果每个请求都往缓存中放入一个条目,从长远来看,它最终可能会溢出工作进程使用的内存。

作为替代方案,您可以尝试使用Sitecore.Context.ClientData 属性。它使用使用数据库的 ClientDataStore(在 web.config 文件中查找 clientDataStore 部分)来存储数据。这些条目可以在 AppPool 回收后继续存在。 尽管如果您经常使用它们,当您需要写入和/或读取条目时,它可能会成为负载下的瓶颈。 如果您确实知道可能会为共享目的创建大量条目,我会创建一个计划任务来清理数据存储中的过时条目。

【讨论】:

  • 不要认为使用应用级缓存是一个非常明智的想法。
  • HttpContext.Current.Cache 是我当前正在使用的缓存,以及我试图避免的,因为它是每个应用程序的范围太广,我只需要范围非常小的东西, 按要求。应用程序池回收不是问题,因为我只需要标志,从请求的一个点移动到另一个点,实际上我正在清除标志添加进程的结束。我检查了ClientData,但是......它不是保存在客户端/浏览器上吗?我不想向客户端发送任何内容,就像内部标志一样,在客户端无用。
【解决方案3】:

我知道这是一个非常古老的问题,但我只想发布我解决过的解决方案

下面将保存每个 http 请求的数据。 HttpContext.Current.Items["ModuleInfo"] = "自定义模块信息"

我们可以将数据存储到一个站点核心管道中的 httpcontext 并在另一个站点中检索...

https://www.codeproject.com/Articles/146455/When-Can-We-Use-HttpContext-Current-Items-to-Store

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多