【问题标题】:When does Sitecore run the initialize pipeline?Sitecore 何时运行初始化管道?
【发布时间】:2014-05-25 06:21:27
【问题描述】:

我一直在浏览 Sitecore.Kernel,但似乎找不到 Sitecore 运行 Initialize 管道的位置。它是在每个页面请求上运行还是在应用程序启动时只运行一次?您能指出为此管道调用 Run 方法的确切位置吗?

更新 我最终问这个问题的原因是因为我在 Sitecore 的代码中追溯mvc.requestBegin 管道的执行。这是我发现的:

  • Initialize 管道运行InitializeRoutes 处理器...
  • Sitecore.Mvc.Pipelines.Loader.InitializeRoutes.Process(PipelineArgs args) 打电话...
  • Sitecore.Mvc.Pipelines.Loader.InitializeRoutes.RegisterRoutes(RouteCollection routes, PipelineArgs args) 来电...
  • Sitecore.Mvc.Pipelines.Loader.InitializeRoutes.SetRouteHandlers(RouteCollection routes, PipelineArgs args) 创建新的 RouteHandlerWrapper 对象

这里的事情变得有点模糊......

  • Sitecore.Mvc.Routing.RouteHandlerWrapper.GetHttpHandler(RequestContext requestContext) 返回(IHttpHandler) new RouteHttpHandler

然后,最后……

  • Sitecore.Mvc.Routing.RouteHttpHandler.ProcessRequest(HttpContext context) 来电...
  • Sitecore.Mvc.Routing.RouteHttpHandler.BeginRequest() 运行 mvc.requestBegin 管道

【问题讨论】:

    标签: sitecore


    【解决方案1】:

    我决定尝试在全新安装的 Sitecore 7.2 中添加一些调试。 我创建了以下简单的类:

    using Sitecore.Diagnostics;
    using Sitecore.Pipelines;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Web;
    
    namespace SCMVC72.Pipelines
    {
        public class DebugStackTrace
        {
            public void Process(PipelineArgs args)
            {
                StackTrace st = new StackTrace(); 
                Log.Info(string.Empty, (object)this);
                Log.Info("*********************************************************************", (object)this);
                Log.Info("Debug StackTrace", (object)this);
                Log.Info(st.ToString(), (object)this);
                Log.Info("*********************************************************************", (object)this);
            }
        }
    }
    

    我在App_Config\Include 文件夹中添加了以下配置文件:

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
      <sitecore>
        <pipelines>
          <initialize>
            <processor type="SCMVC72.Pipelines.DebugStackTrace, SCMVC72" 
                       patch:before="processor[@type='Sitecore.Pipelines.Loader.ShowVersion, Sitecore.Kernel']" />
          </initialize>
        </pipelines>
      </sitecore>
    </configuration>
    

    在应用程序重新启动时,这是我在日志中得到的输出:

    5764 14:38:08 INFO  HttpModule is being initialized
    5764 14:38:08 INFO  
    5764 14:38:08 INFO  *********************************************************************
    5764 14:38:08 INFO  Debug StackTrace
    5764 14:38:08 INFO     at SCMVC72.Pipelines.DebugStackTrace.Process(PipelineArgs args)
       at (Object , Object[] )
       at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
       at Sitecore.Nexus.Web.HttpModule.Application_Start()
       at Sitecore.Nexus.Web.HttpModule.Init(HttpApplication app)
       at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
       at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
       at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
       at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)
    5764 14:38:08 INFO  *********************************************************************
    

    这是著名人物之前的输出:

    5764 14:38:08 INFO  
    5764 14:38:08 INFO  **********************************************************************
    5764 14:38:08 INFO  **********************************************************************
    5764 14:38:08 INFO  Sitecore started
    5764 14:38:08 INFO  Sitecore.NET 7.2 (rev. 140228)
    

    这证实了约翰·韦斯特殿下在写道“这发生在其中一个混淆程序集中”——更准确地说是 Sitecore.Nexus 时所说的话。

    【讨论】:

      【解决方案2】:

      Sitecore.Context 类中有一个SetActiveSite 方法。这运行Intialize 管道,并且有几个地方可以调用该方法。

      • JobRunner.InitalizeContext
      • MediaCreator.SetContext
      • MediaRequestHandler.RedirectIfUserShouldBeLoggedIn
      • WebDavMediaRequestHandler.ProcessRequest

      因此它似乎与上下文的初始化相关联,因此不仅仅是在应用程序的开头。

      有关信息,我通过搜索"Initalize"(包括引号)找到了这个,它找到了这个:

      CorePipeline.Run("initialize", new PipelineArgs());
      

      【讨论】:

      • 现在谁调用InitializeContext 方法以及何时调用会很有趣。我猜测,如果SetActiveSite 运行Initialize 管道,这意味着HttpBeginRequest 管道必须已经运行(因为这是确定站点、上下文项、用户等的管道)
      • 我快速浏览了一下。它被称为Job 管道的一部分。在 web.config 中搜索InitializeContext
      • 所以它看起来像是一个“人造”上下文的创建。本文暗指briancaos.wordpress.com/2012/02/06/using-sitecore-jobs
      • 是的,我也发现了这一点。退后一步,整个调查从试图了解谁调用/何时调用mvc.beginRequest 管道开始。我发现它是由RouteHttpHandler.BeginRequest() 调用的,它是由RouteHandlerWrapper.GetHttpHandler() 调用的,它在initialize 管道的执行过程中被调用。现在我发现每当运行作业时都会发生这种情况。但是作业是在单独的线程中运行的,所以我认为这不是正确的执行路径......丢失:)
      • HRH John West 声明 "&lt;initialize&gt;: Initializes the Sitecore application"sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/… 很可能,这发生在其中一个混淆程序集中,因此追踪它的机会不大。
      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2021-06-03
      • 2019-04-28
      相关资源
      最近更新 更多