【问题标题】:Tracking a Page Event from ASHX Handler从 ASHX 处理程序跟踪页面事件
【发布时间】:2016-02-24 08:57:21
【问题描述】:

我目前正在尝试在 ASHX 处理程序中跟踪 PageEvent。我的代码基本上是这样的:

public class GetProductPdf : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        if (!Tracker.IsActive)
        { 
            Tracker.Initialize();
            Tracker.StartTracking();
        }

        //Track PageEvent here...
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Tracker 始终处于非活动状态,并且 Tracker.Current == null。在方法调用“Tracker.StartTracking();”抛出以下异常:

[InvalidOperationException: Tracker.Current is not initialized]
Sitecore.Analytics.Pipelines.StartAnalytics.StartTracking.Process(PipelineArgs args) +317
(Object , Object[] ) +83
Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) +445
 Project.Web.Handler.PdfCreation.GetProductPdf.ProcessRequest(HttpContext context) in d:\Project\Website\Handler\PdfCreation\GetProductPdf.ashx.cs:69
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +913
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +165

我尝试了here建议的所有可能的解决方案。

在 mvc 控制器中执行相同操作时,Tracker 处于活动状态并且 Tracker.Current != null。

有没有人有想法,可能是什么原因造成的,或者有其他解决方案的建议吗?

提前致谢。

【问题讨论】:

  • 你是如何注册你的处理程序的?如果您以与注册 sitecore_media_handler 相同的方式执行此操作,那么您将拥有一个有效的 Sitecore 上下文。
  • 我认为这是一个时间问题,处理程序开得太快了。有一个用于初始化跟踪器的管道,因此您不需要这样做。如果在此之后调用您的代码,那么 Tracker 应该可以正常工作。但是,如果您确实需要调用初始化,我很确定它依赖于会话可用,因此您可以尝试将 IRequiresSessionState 添加到您的处理程序中。

标签: sitecore ashx sitecore8 sitecore8.1 sitecore-analytics


【解决方案1】:

我不确定您的Ashx Handler 是否可以在必要的 Sitecore 上下文中执行,因此Tacker.Current 将无效,也无法通过Tracker.StartTracking() 启动。有人可能会确认,但我有另一种解决方案,你可以尝试一下,它对我有用。

尽管Ashx Handler 为您注册Event 会很好,但您可以在文件链接上触发JavaScript 函数。这样当点击链接时,JavaScript 会向 MVC Controller 发出 Web 请求,并且控制器会为您注册事件。

我自己使用WebApi Controllers 实现了这个。 Data Attributesa tag 上,JavaScript 将这些属性发布到控制器,控制器使用这些属性来确定要注册的 Event 以及要在事件上使用的 description

<asp:HyperLink runat="server" data-goalid="{08030449-A811-428B-95F0-59FCD42B8DEB}" data-goaldescription="Product 0112 brochure">
[System.Web.Mvc.HttpPost]
public JsonResult RegisterGoal(string goalId, string goalDescription)
{
    Item eventItem = Sitecore.Context.Database.GetItem(goalId);
    var goal = new PageEventItem(eventItem);

    var eventData = Tracker.Current.PreviousPage.Register(goal);
    eventData.Data = goal["Description"] + " " + goalDescription;
    Tracker.Current.Interaction.AcceptModifications();

    return Json(new PageEventRequestResult()
    {
        Success = true,
        Message = "Successfully registered goal",
    });
}

效果很好。唯一的缺点是必须将其添加到指向您要跟踪的文件的各种链接中。

我写了一篇关于 tracking various interactions on a site and registering Sitecore Events / Goals 的博客,您可能想看看,向下滚动到“在 xDB 中存储自定义数据”部分。

【讨论】:

  • 这完全取决于您如何注册处理程序。媒体请求由具有有效 Sitecore 上下文的处理程序提供服务。您只需向 Sitecore 注册它,而不是使用标准的 .net 方式。
  • 很高兴知道,一旦在 Sitecore 注册后,看看 OP 是否恢复正常工作会很有趣
  • 感谢您的回答。我自己考虑了第一个解决方案,但是由于会有来自外部来源的请求,我们也想跟踪,这不是一个选项。处理程序实际上是通过 sitecore 方式注册的。我还看到了可以完成和工作的解决方案,但不适用于我。显然,在调试了几个小时并且没有进行任何重大更改之后,跟踪器无缘无故地开始工作......我不知道,为什么它现在可以工作,或者为什么它以前不能工作,但现在它可以了。仍然感谢您的帮助和时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多