Отслеживание события страницы из обработчика ASHX
В настоящее время я пытаюсь отследить PageEvent в обработчике ASHX. Мой код в основном выглядит так:
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.Current == ноль. Вызов метода "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
Я перепробовал все возможные решения, предложенные здесь.
Когда вы делаете то же самое в контроллере mvc, Tracker активен и Tracker.Current!= Null.
У кого-нибудь есть идея, что может вызвать это, или есть другие предложения для решения?
Заранее спасибо.
1 ответ
Я не уверен, что ваш Ashx Handler
может быть выполнен в необходимом контексте Sitecore, чтобы Tacker.Current
не будет действительным и не может быть запущен через Tracker.StartTracking()
, Кто-то может подтвердить, но у меня есть другое решение, которое вы можете попробовать, и оно мне подходит.
Как хорошо, как это было бы для Ashx Handler
зарегистрировать Event
вместо этого вы можете запустить функцию JavaScript по ссылке на файл. Чтобы при нажатии на ссылку JavaScript отправлял веб-запрос MVC Controller
и контроллер регистрирует событие для вас.
Я реализовал это сам, используя 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",
});
}
Это работает очень хорошо. Единственным недостатком является добавление его к различным ссылкам, которые ведут к файлам, которые вы хотите отслеживать.
Я написал блог о том, как отслеживать различные взаимодействия на сайте и регистрировать события / цели Sitecore, на которые вы, возможно, захотите посмотреть, прокрутите вниз до раздела "Хранение пользовательских данных в xDB".