For me, I found that HttpContext.Current was null, so I created it:
System.Web.HttpContext c = System.Web.HttpContext.Current; 
And I passed that into my function that was in my other class, like this:
string myString = "Something to save";
SessionExtensions.SetDataToSession<string>(c, "MyKey1", myString);
I had actually wanted my function to be a real extension method off of Session like the one below, but what I found was this HttpSessionStateBase session was null, it would give the NullReferenceException when I tried to add anything to Session using it. So this:
public static class SessionExtensions 
{ 
   /// <summary> 
   /// Get value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <returns></returns> 
   public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) 
   { 
       return (T)session[key]; 
   } 
   /// <summary> 
   /// Set value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <param name="value"></param> 
   public static void SetDataToSession<T>(this HttpSessionStateBase session, string key, object value) 
   { 
       session[key] = value; 
   } 
} 
That Microsoft had here:  https://code.msdn.microsoft.com/How-to-create-and-access-447ada98 became this, instead:
public static class SessionExtensions 
{ 
   /// <summary> 
   /// Get value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <returns></returns> 
   public static T GetDataFromSession<T>(HttpContext context, string key) 
   { 
        if (context != null && context.Session != null)
        {
            context.Session.Abandon();
        }
        return (T)context.Session[key];
   } 
   /// <summary> 
   /// Set value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <param name="value"></param> 
   public static void SetDataToSession<T>(HttpContext context, string key, object value) 
   { 
       context.Session[key] = value; 
   } 
} 
And I was able to retrieve my data like this:
System.Web.HttpContext c = System.Web.HttpContext.Current;
string myString = SessionExtensions.GetDataFromSession<string>(c, "MyKey1");
And, of course, since HttpContext.Current and Session now exists, I was able to even simplify that to be:
 string myString = Session["MyKey1"].ToString();
If this had been object, you would put the object's type in place of <string> in the SetDataToSession()
function:
List<string> myStringList = new List<string>();
myStringList.Add("Something to save");
SessionExtensions.SetDataToSession<List<string>>(c, "MyKey1", myStringList);
And to retrieve it:
System.Web.HttpContext c = System.Web.HttpContext.Current;
List<string> myStringList = SessionExtensions.GetDataFromSession<List<string>>(c, "MyKey1");
or simply:
List<string> myStringList = (List<string>)Session["MyKey1"];