2014-04-21 4 views
1

필요한 경우에만 "httpRequestBegin"파이프 라인에서 일부 작업을 수행하려고합니다. Sitecore가 먼저 해결할 수없는 경우에도 사용자를 해결하므로 Sitecore가 사용자 (프로세서 유형 = "Sitecore.Pipelines.HttpRequest.UserResolver, Sitecore.Kernel")를 해결 한 후 프로세서가 실행됩니다.Sitecore 파이프 라인을 통해 데이터 공유

나중에 파이프 라인 "insertRenderings"에서 이전 파이프 라인의 동작이 실행 된 경우에만 렌더링을 추가하고 싶습니다. (사용자를 확인하고 메시지를 표시 한 경우) 일부 "플래그를 저장하려고합니다. "첫 단계에서 두 번째 단계를 확인하십시오. 내 질문은, 그 깃발을 어디에서 저장할 수 있습니까?

  • 세션 : 잘못된, 너무 일찍 세션이 아직 존재하지 않는 것

    이 가

    는 지금까지 내가 해봤 ... "의 요청에 따라"캐시의 일종을 찾기 위해 노력 했는데요 .

  • 항목 (HttpContext.Current.Items) : 둘 다 작동하지 않으며 항목이 초 단계에 없습니다.

지금까지 일부 고유 키와 함께 응용 프로그램 캐시 (HttpContext.Current.Cache)를 사용하고 있지만이 솔루션이 마음에 들지 않습니다.

누구든지이 "깃발"을 공유하는 더 나은 방법을 알고 있습니까?

+0

httpRequestBegin에서하고있는 일을 살필 수 있도록 질문을 업데이트 해 주실 수 있습니까? 또한 httpRequestBegin에서 프로세서가 어디에서 발생합니까? –

+0

질문이 업데이트되었습니다. 나는 sitecore 사용자가 해결 된 직후 사용자를 해결하고있다. –

+0

insertrenderings 프로세서의 활성 사용자 (도메인 또는 역할)를 확인하여 문제를 해결할 수 있습니까? –

답변

0

HttpContext.Current.Cache 또는 HttpRuntime.Cache이 가장 빠른 해결책이 될 수 있습니다. 이 접근법은 AppPool이 재활용 될 때 데이터를 보존하지 않습니다. 캐시에 키를 몇 개만 추가하고 유지하면이 솔루션이 도움이 될 수 있습니다. 각 요청이 캐시에 항목을 넣으면 결국에는 장기적으로 작업자 프로세스에서 사용되는 메모리가 오버플로 될 수 있습니다.

이 대신에 Sitecore.Context.ClientData 속성을 사용해 볼 수 있습니다. 데이터베이스를 사용하는 ClientDataStore를 사용하여 데이터를 저장합니다 (clientDataStore 섹션은 web.config 파일에서 찾습니다). 이러한 항목은 AppPool 재활용 후에도 유지 될 수 있습니다. 많이 사용하면 항목에 쓰거나 읽어야 할 때로드가 병목 현상이 될 수 있습니다. 공유 목적으로 만들어진 많은 항목이있을 수 있다는 것을 알고 있다면 쓸모없는 항목에서 데이터 저장소를 정리하는 예약 된 작업을 만듭니다.

+1

응용 프로그램 수준 캐시를 사용하는 것이 현명한 생각이라고 생각하지 마십시오. –

+0

HttpContext.Current.Cache는 내가 현재 사용하고있는 캐시이며, 너무 넓은 범위의 응용 프로그램이므로 피하기 위해 노력하고 있습니다. 요청 당 매우 작은 범위가 필요한 것입니다. 응용 프로그램 풀 리사이클링은 플래그를 필요로하므로 요청의 한 지점에서 다른 지점으로 이동하는 데 문제가되지 않습니다. 사실 플래그를 지우고 프로세스의 끝 부분을 추가합니다. ClientData를 확인했지만 클라이언트/브라우저에 저장되지 않았습니까? 내부 플래그와 마찬가지로 클라이언트에게 아무 것도 보내지 않으므로 클라이언트 측에서 쓸모가 없습니다. –

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.QueryString 또는 Request.Params에 추가 생각하지만, 사람들은 읽기 전용입니다. 그러나 한 번만 처리해야하는 경우 (즉 처음 해결되었을 때만) 다음 요청에서 헤더가 추가되지 않고 기본값으로 돌아 오기 때문에 작동합니다.

+0

이것이 최선의 방법이라고 생각합니다. 문제는 내가 생각할 수있는 다른 모든 저장소가 응용 프로그램에서 공유되므로 요청에 대해 격리되지 않는다는 것입니다. (ab) 요청 헤더를 사용하여 잘 작동합니다. –

관련 문제