This has not been fully tested, but it looks like a new entry is being created in the Visites table with the corresponding CampaignId when I change the querystring sc_camp . Basically, I pulled out the CreateVisit method from the Sitecore.Analytics.Pipelines.InitializeTracker.Initialize pipeline processor (along with several other private support methods - argh, private methods!).
Not very elegant, but it seems to work, although several conditional checks may be required to create a new visit. I placed this processor after Sitecore.Analytics.Pipelines.InitializeTracker.Initialize processor .
public class RestartVisitOnNewCampaign : InitializeTrackerProcessor { public override void Process(InitializeTrackerArgs args) { if (HttpContext.Current == null) { args.AbortPipeline(); } //no need to restart visit if visit is new if (Tracker.CurrentVisit.VisitPageCount < 1) { return; } //look for campaign id in query string Guid campaign; var campaignStr = WebUtil.GetQueryString(Settings.GetSetting("Analytics.CampaignQueryStringKey")).Trim(); if (string.IsNullOrEmpty(campaignStr) || !Guid.TryParse(campaignStr, out campaign)) { return; } //don't restart if the campaign isn't changing if (!Tracker.CurrentVisit.IsCampaignIdNull() && Tracker.CurrentVisit.CampaignId == campaign) { return; } Tracker.EndVisit(false); //restart visit by setting new ID //var visitCookie = new VisitCookie(); //visitCookie.VisitId = ID.NewID.Guid; //visitCookie.Save(); Visitor visitor = Tracker.Visitor; CreateNewVisit(HttpContext.Current, visitor); } protected virtual void CreateNewVisit(HttpContext httpContext, Visitor visitor) { VisitorDataSet.VisitsRow currentVisit = visitor.CurrentVisit; if ((currentVisit == null) || (currentVisit.VisitId != visitor.CookieVisitId)) { currentVisit = visitor.CreateVisit(visitor.CookieVisitId); } currentVisit.AspNetSessionId = WebUtil.GetSessionID(); HttpRequest request = httpContext.Request; byte[] ip = GetIp(request.UserHostAddress ?? string.Empty); string majorName = request.Browser.Browser; string minorName = request.Browser.Version; string version = request.Browser.Version; string str4 = request.Browser.Platform; string str5 = string.Empty; string str6 = string.Empty; currentVisit.Ip = ip; currentVisit.Browser = visitor.DataContext.GetBrowser(majorName, minorName, version); currentVisit.UserAgent = visitor.DataContext.GetUserAgent(request.UserAgent ?? string.Empty); currentVisit.GeoIp = visitor.DataContext.GetGeoIp(ip); currentVisit.Location = visitor.DataContext.GetLocation(string.Empty, string.Empty); currentVisit.RDNS = request.UserHostName ?? string.Empty; currentVisit.OperatingSystem = visitor.DataContext.GetOperatingSystem(str4, str5, str6); currentVisit.Screen = visitor.DataContext.GetScreen(GetDimensions(request)); currentVisit.DeviceName = (Sitecore.Context.Device == null) ? string.Empty : Sitecore.Context.Device.Name; currentVisit.Language = Sitecore.Context.Language.Name; SiteContext site = Sitecore.Context.Site; if (site != null) { currentVisit.MultiSite = site.Name; } var args = new CreateVisitArgs(currentVisit, request); CreateVisitPipeline.Run(args); } protected virtual byte[] GetIp(string userHostAddress) { IPAddress address; if (IPAddress.TryParse(userHostAddress, out address)) { return address.GetAddressBytes(); } Log.Warn("Failed to parse ip address: " + userHostAddress, this); return new byte[4]; } protected virtual string GetDimensions(HttpRequest request) { HttpBrowserCapabilities browser = request.Browser; if (browser == null) { return string.Empty; } return string.Format("{0}x{1}", browser.ScreenPixelsWidth, browser.ScreenPixelsHeight); } }
source share