Sitecore.Analytics.Tracker.Current является нулевым, когда вызывается через конвейер

Мне нужно перенаправить в зависимости от местоположения страны, к которой пытается получить доступ пользователь. Например, когда пользователь пытается получить доступ к http://www.example.com/ из Китая, мой сайт должен выглядеть как http://www.example.com/zh. Я проверяю использование трекера sitecore в процессе конвейера, чтобы получить код страны, используя метод ниже.

public void Process(HttpRequestArgs args)
    {
        Assert.ArgumentNotNull(args, "args");

        if (HttpContext.Current == null
          || Context.Site == null
            ////TODO:       || Sitecore.Context.PageMode...
          || Context.Database == null || Context.Site.Name == "shell" || !this._sites.Contains(Context.Site.Name))
        {
            return;
        }

        // contains path including language and query string
        // (not anchor name), but not hostname.
        // We can use this to add the language back into the path.
        string rawPath = Sitecore.Context.RawUrl;

        if (!rawPath.StartsWith("/sitecore") && !rawPath.StartsWith("/" + Sitecore.Context.Language.Name + "/") && !rawPath.StartsWith("/" + Sitecore.Context.Language.Name) && !rawPath.StartsWith("/default.aspx"))
        {
            string langCode = "";

            if(!string.IsNullOrEmpty(GeoIPUtils.GetUserGeoIP()))
            {
                try
                {
                    string country = GeoIPUtils.GetUserGeoIP();;
                    if (country.Trim().ToUpper() == "China".ToUpper())
                        langCode = "zh";
                    else if (country.Trim().ToUpper() == "Japan".ToUpper())
                        langCode = "jp";
                    else if (country.Trim().ToUpper() == "Thailand".ToUpper())
                        langCode = "th";
                    else
                        langCode = "en";

                }
                catch(Exception)
                {
                    langCode = "en";
                }
            }
            else
            {

                langCode = HttpContext.Current.Request.Cookies["avc#lang"].Value.ToString();
            }

            if (!string.IsNullOrEmpty(langCode))
            {
                Language language = null;
                if (Language.TryParse(langCode, out language))
                {
                    //then try to get the language item id from the language or two letter iso code             
                    ID langID = LanguageManager.GetLanguageItemId(language, Sitecore.Context.Database);
                    if (!ID.IsNullOrEmpty(langID))
                    {
                        //sometimes the language found is slightly different than official language item used in SC                 
                        language = LanguageManager.GetLanguage(language.CultureInfo.TwoLetterISOLanguageName);

                        if (Context.Item != null)
                        {
                            List<string> availableLangs = LanguagesWithContent(Context.Item);
                            if (availableLangs != null && availableLangs.Count > 0 && !availableLangs.Contains(language.CultureInfo.TwoLetterISOLanguageName.ToString()))
                            {
                                langCode = availableLangs.FirstOrDefault().ToString();
                            }
                        }
                        else
                        {
                            langCode = "en";
                        }
                    }
                    else
                    {
                        langCode = "en";
                    }
                }
            }

            HttpContext.Current.Response.RedirectPermanent("/" + (String.IsNullOrEmpty(langCode) ? Sitecore.Context.Language.Name : langCode) + rawPath);

        }
    }

Ниже приведена функция GetUserGeoIP

public static string GetUserGeoIP()
    {
        string countryCode = "";
        try
        {
            countryCode = Sitecore.Analytics.Tracker.Current.Interaction.GeoData.Country;
        }
        catch(Exception ex)
        {
            Log.Error("GetUserGeoIP Error: " + ex.Message + " Source: " + ex.Source + " Stack Trace :" + ex.StackTrace + " Inner Ex : " + ex.InnerException, ex);
            countryCode = "GB";

        }

        if (!string.IsNullOrEmpty(countryCode))
        {
            var countryItem = ISO3166.FromAlpha2(countryCode);
            if (countryItem != null)
                return countryItem.Name;
        }

        return "Other";
    }

Но я получаю исключение ниже

7904 10:43:25 ERROR Cannot create tracker.
Exception: System.InvalidOperationException
Message: session is not initialized
Source: Sitecore.Analytics
   at Sitecore.Analytics.Data.HttpSessionContextManager.GetSession()
   at Sitecore.Analytics.Pipelines.EnsureSessionContext.EnsureContext.Process(InitializeTrackerArgs args)
   at (Object , Object[] )
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Analytics.DefaultTracker.EnsureSessionContext()
   at Sitecore.Analytics.Pipelines.CreateTracker.GetTracker.Process(CreateTrackerArgs args)
   at (Object , Object[] )
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Analytics.Tracker.Initialize()

Примечание: тот же метод GetUserGeoIP используется в API, который получает правильное название страны. Я использую Sitecore.NET 8.0 ( версия 151127)

Любая помощь по этому вопросу высоко ценится

1 ответ

Ваш процессор, вероятно, слишком рано в конвейере (ах). Вы можете найти обзор конвейеров запросов здесь: http://sitecoreskills.blogspot.be/2015/02/a-sitecore-8-request-from-beginning-to.html

Вы должны установить свой процессор после инициализации трекера и получения геоданных. Я сделал нечто подобное некоторое время назад и поместил свой процессор в startAnalytics трубопровод.

Выборка геоданных является асинхронной, что может (будет) вызывать проблемы при выполнении этого в первом конвейере запросов. Прочитайте эту статью, чтобы решить эту проблему, позвонив UpdateGeoIpData с временным интервалом.

Другие вопросы по тегам