从ASHX处理程序跟踪页面事件

时间:2016-02-24 08:57:22

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

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

event.respondWith()

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

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;
        }
    }
}

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

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

有没有人有想法,可能导致此问题的原因或是否有任何其他解决方案的建议?

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

Ashx Handler为您注册Event一样好,相反,您可以在文件的链接上触发JavaScript函数。因此,当单击链接时,JavaScript会向MVC Controller发出Web请求,并且控制器会为您注册该事件。

我自己使用WebApi Controllers实现了这一点。 Data Attributes上有a 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中存储自定义数据&#39;部分。