Недавно я столкнулся с похожим сценарием, когда нужно было отслеживать аналитическое событие в веб-сервисе. Как вы заметили, проблема в том, что AnalyticsTracker.Current
является нулевым в контексте веб-службы.
Причина этого заключается в том, что AnalytisTracker.Current
заполняется во время конвейера trackAnalytics
, который, в свою очередь, вызывается во время конвейера renderLayout
, который вызывается только в том случае, если элемент контекста не равен нулю и элемент контекста имеет представление настройки определены.
С учетом сказанного есть обходной путь:)
Вы можете запустить AnalyticsTracker
вручную следующим образом:
if (!AnalyticsTracker.IsActive)
{
AnalyticsTracker.StartTracking();
}
Затем вы можете получить экземпляр AnalyticsTracker
следующим образом:
AnalyticsTracker tracker = AnalyticsTracker.Current;
if (tracker == null)
return;
И, наконец, вы можете создавать и запускать свое событие, профиль и т. Д. В приведенном ниже примере запускается PageEvent
. Примечание. Особое внимание следует уделить PageEvent
(и, скорее всего, другим событиям), чтобы заполнить свойство Timestamp
. Смотрите комментарии в коде ниже.
if (!AnalyticsTracker.IsActive)
{
AnalyticsTracker.StartTracking();
}
AnalyticsTracker tracker = AnalyticsTracker.Current;
if (tracker == null)
return;
string data = HttpContext.Current.Request.UrlReferrer != null
? HttpContext.Current.Request.UrlReferrer.PathAndQuery
: string.Empty;
//Need to set a context item in order for the AnalyticsPageEvent.Timestamp property to
//be set. As a hack, just set the context item to a known item before declaring the event,
//then set the context item to null afterwards.
Sitecore.Context.Item = Sitecore.Context.Database.GetItem("/sitecore");
AnalyticsPageEvent pageEvent = new AnalyticsPageEvent();
pageEvent.Name = "Download Registration Form Submitted";
pageEvent.Key = HttpContext.Current.Request.RawUrl;
pageEvent.Text = HttpContext.Current.Request.RawUrl;
pageEvent.Data = data;
//Set the AnalyticsPageEvent.Item property to null and the context item to null.
//This way the PageEvent isn't tied to the item you specified as the context item.
pageEvent.Item = null;
Sitecore.Context.Item = null;
tracker.CurrentPage.TriggerEvent(pageEvent);
tracker.Submit();
Надеюсь, это поможет!