I have a problem with Sitecore.Analytics
From my xslt, I do an ajax call to a webservice using jQuery.
In my webservice I need to register/save some Sitecore.Analytics
data.
The problem is that I can't use Sitecore.Analytics.AnalyticsTracker.Current
.
So how do I do TriggerProfile
and TriggerEvent
?
I wonder if Sitecore.Analytics.AnalyticsManager
could be to any help.
I recently encountered a similar scenario in having to track an analytics event within a webservice. As you noted, the problem is that AnalyticsTracker.Current
is null within the context of a webservice.
The reason for this is that AnalytisTracker.Current
is populated during the trackAnalytics
pipeline, which in turn is invoked during the renderLayout
pipeline, which is only invoked if the context item is not null and the context item has presentation settings defined.
With that said, there is a workaround :)
You can start the AnalyticsTracker
manually like so:
if (!AnalyticsTracker.IsActive)
{
AnalyticsTracker.StartTracking();
}
You can then retrieve an AnalyticsTracker
instance like so:
AnalyticsTracker tracker = AnalyticsTracker.Current;
if (tracker == null)
return;
And finally, you can create and trigger your event, profile, etc... The example below triggers a PageEvent
. Note: there is a special consideration to be made for a PageEvent
(and most likely other events) in order to get the Timestamp
property populated. See the comments in the code below.
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();
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With