Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more

Tobias
Aug 25, 2020
  27
(0 votes)

Using the ASP.Net Async SessionState Module together with Episerver Visitor Groups

The ASP.Net Async SessionState Module has several benefits over the older default one as it is fully async.

To use it in an Episerver site is mostly plug and play, just follow the instructions on Microsoft dev blog and your are good to go. There is one scenario I have found were it doesn't work and that is with Visitor Group criterias that use the session as a storage of state. When registering the session-based criterias they look for the default session state module and if it cannot find it, the criterias will not work. One of these criteras is Landing URL / starting URL, which is used for determining what page on the site the user first visited.

In order to support the Async module we will have to basically redo what Episerver has done, but switch out the default module for the Async module.

First we create a IInitializationHttpModule and in it we initialize our own State storage handler, as Episervers' VisitorGroupStateStorageHandler only works for the default session stage module.

/// <remark> Taken from Epis VisitorGroupHttpInitialization, to support SessionStateModuleAsync </remark>
[InitializableModule]
public class AsyncVisitorGroupHttpHandler : IInitializableHttpModule
{
    private AsyncVisitorGroupStateStorageHandler _storageHandler;

    public void Initialize(InitializationEngine context)
    {
    }

    public void Uninitialize(InitializationEngine context)
    {
    }

    public void InitializeHttpEvents(HttpApplication application)
    {
        Create().Initialize(application.Modules, CriterionEvents.Instance);
    }

    private AsyncVisitorGroupStateStorageHandler Create()
    {
        if (_storageHandler == null)
        {
            _storageHandler = new AsyncVisitorGroupStateStorageHandler();
        }

        return _storageHandler;
    }
}

Now we create or state storage handler. Here the important part is that we go through all modules registered and find the SessionStateModuleAsync module so we can hook into session start event. The Visitor group criteria will listen to this, among other events, and for example store the landing URL of the user.

/// <remark> This is taken from Epis own implementation of VisitorGroupStateStorageHandler, but made to support SessionStateModuleAsync </remark>
public class AsyncVisitorGroupStateStorageHandler
{
    static ILogger _log = LogManager.GetLogger(typeof(AsyncVisitorGroupStateStorageHandler));
    public void Initialize(HttpModuleCollection application, ICriterionEventsRaiser instance)
    {
        var sessionModule = (SessionStateModuleAsync) application.AllKeys.Select(k => application[k])
            .SingleOrDefault(module =>
                module is SessionStateModuleAsync);
        if (sessionModule != null)
        {
            sessionModule.Start += (sender, args) =>
            {
                instance.RaiseStartSession(sender,
                    new CriterionEventArgs(new HttpContextWrapper(HttpContext.Current)));
            };
        }
        else
        {
            _log.Warning("No SessionStateModuleAsync found, criterias relying on session state will not work");
        }
    }
}

With this code in place we should now see our visitor groups working as intended.

Aug 25, 2020

Comments

Please login to comment.
Latest blogs
Optimizely Configured Commerce and Spire CMS - Figuring out Handlers

I recently entered the world of Optimizely Configured Commerce and Spire CMS. Intriguing, interesting and challenging at the same time, especially...

Ritu Madan | Mar 12, 2025

Another console app for calling the Optimizely CMS REST API

Introducing a Spectre.Console.Cli app for exploring an Optimizely SaaS CMS instance and to source code control definitions.

Johan Kronberg | Mar 11, 2025 |

Extending UrlResolver to Generate Lowercase Links in Optimizely CMS 12

When working with Optimizely CMS 12, URL consistency is crucial for SEO and usability. By default, Optimizely does not enforce lowercase URLs, whic...

Santiago Morla | Mar 7, 2025 |

Optimizing Experiences with Optimizely: Custom Audience Criteria for Mobile Visitors

In today’s mobile-first world, delivering personalized experiences to visitors using mobile devices is crucial for maximizing engagement and...

Nenad Nicevski | Mar 5, 2025 |

Unable to view Optimizely Forms submissions when some values are too long

I discovered a form where the form submissions could not be viewed in the Optimizely UI, only downloaded. Learn how to fix the issue.

Tomas Hensrud Gulla | Mar 4, 2025 |

CMS 12 DXP Migrations - Time Zones

When it comes to migrating a project from CMS 11 and .NET Framework on the DXP to CMS 12 and .NET Core one thing you need to be aware of is the...

Scott Reed | Mar 4, 2025