跨Sitecore管道共享数据

跨Sitecore管道共享数据,sitecore,Sitecore,我试图在管道“httpRequestBegin”中仅在必要时执行一些操作。 我的处理器在Sitecore解析用户后执行(processor type=“Sitecore.Pipelines.HttpRequest.UserResolver,Sitecore.Kernel”),因为如果Sitecore无法首先解析用户,我也在解析用户 稍后,我想在管道“insertRenderings”中添加一些渲染,只有在执行了前一管道中的操作时(如果我解析了用户,则显示一条消息),所以我试图在第一步中保存一些“

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

稍后,我想在管道“insertRenderings”中添加一些渲染,只有在执行了前一管道中的操作时(如果我解析了用户,则显示一条消息),所以我试图在第一步中保存一些“标志”,以便在第二步中进行检查。 我的问题是,我在哪里可以储存国旗?我试图找到某种“每请求”缓存

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

  • 会话:错,太早了,会话还不存在
  • Items(HttpContext.Current.Items):它也不起作用,我的item在秒步骤中不存在
到目前为止,我使用的应用程序缓存(HttpContext.Current.cache)带有一些唯一的密钥,但我不喜欢这个解决方案


任何人都知道共享此“标志”的更好方法吗?

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

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

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

// 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.QueryString
Request.Params
会更好,但它们是只读的。但是,如果您只需要一次性交易(即,仅在第一次解决时)才需要此选项,则此选项将起作用,因为在下一次请求中,标题将恢复为默认值,而不添加自定义标题。

我知道这是一个非常老的问题,但我只想要我解决过的后期解决方案

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

我们可以在一个sitecore管道中将数据存储到httpcontext,然后在另一个管道中检索


您能否更新您的问题以充实您在httpRequestBegin中所做的工作?另外,在httpRequestBegin中,处理器出现在哪里?问题已更新。在执行sitecore用户解析后,我正在解析该用户。您可以通过检查insertrenderings处理器中的活动用户(可能是他们的域或角色)来解决问题吗?用户属性上没有任何内容告诉我“我”是解决了问题还是sitecore解决了问题。我曾考虑向概要文件中添加一些属性,但我不喜欢将其物理存储在核心数据库中的想法。您知道是否可以将属性保存在内存中并在以后重新使用它们吗?请尝试使用
Sitecore.Context.Items
collection。不要认为使用应用程序级缓存是一个非常明智的想法。HttpContext.Current.Cache是我当前使用的缓存,也是我试图避免的,因为它是针对范围过宽的每个应用程序的,我只是需要一个非常小的范围内的东西,根据要求。应用程序池回收不是一个问题,因为我只需要标志,从请求的一个点移动到另一个点,事实上,我正在清除标志添加过程的结束。我检查了客户数据,但是。。。它不是保存在客户端/浏览器上吗?我不想向客户发送任何东西,因为这是一个内部标志,在客户端是无用的。我认为这是你最好的选择。问题是,您可以使用的所有其他存储(我能想到的)都是在应用程序中共享的,因此对于请求不是孤立的。(ab)使用请求头非常有效。