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.AnalyticsTracke开发者_JS百科r.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!
I just like to add an extra comment to share my experience. In case you have a POST RESTful service call in which you implement the method to register Page Events, make sure to use Simple REST client extension of Chrome instead of Fiddler for sending the POST request . I ran into a situation where I was using Fiddler to call POST RESTful service, the code was executing fine, but I did not see any entry in the Page Events Table (Problem I think could have been associated to the browser session maybe).
For DMS 2.0, I followed similar article on StackOverflow and wrote the following to register the event.
void TriggerPageEvent(string eventName)
{
if (!Tracker.IsActive)
{
Tracker.StartTracking();
}
Sitecore.Data.Database db = Sitecore.Configuration.Factory.GetDatabase("web");
Sitecore.Context.Item = db.GetItem("/sitecore");
PageEventData pageEventData = new PageEventData(eventName);
pageEventData.Text = "Value is here";
pageEventData.DataKey = String.Empty;
pageEventData.Data = " Data is here";
pageEventData.ItemId = new Guid(Cms.Context.Item.ID.ToString());
Tracker.CurrentPage.Register(pageEventData);
Tracker.Submit();
}
If you want to register page event/goal and you use your custom handler to get data from ajax/jquery request, please be sure if your location for the handler an appropriate for the analytic. It means, if your handler is located, for example in /mylocation/myhandlers/myhandler.ashx you need to implement next, add this string to your config file:
<site name="your_name" virtualFolder="/mylocation/myhandlers" physicalFolder="/mylocation/myhandlers" enableAnalytics="true" domain="sitecore" database="master" patch:before="site[@name='website']" />
It should help. As you can see, in this case, your analytic is enabled.
Make sure to include the attribute/value [WebMethod(EnableSession = true)]
to your WebMethod
, and this will work correctly.
精彩评论