Я начал с приложения WebForms.NET 4.51. Затем я добавил WebAPI к тому же приложению. В Session_Start() я создаю экземпляр переменной, который я храню в сеансе следующим образом:
public class Global : HttpApplication
{
protected void Session_Start(object aSender, EventArgs aEventArgs)
{
//Create an object to hold all the settings for the user in the session. This is only loaded once we
//have a user successfully logged in
HttpContext.Current.Session[SYSTEM_SETTINGS_SESSION_KEY] = new SystemSettings();
}
}
и у меня есть простой аксессуар для свойств следующим образом:
public class Global : HttpApplication
{
public static SystemSettings SystemSettings
{
get
{
if (HttpContext.Current == null)
return null;
return HttpContext.Current.Session[SYSTEM_SETTINGS_SESSION_KEY] as SystemSettings;
}
}
}
Все это работает хорошо, когда я получаю доступ к свойству из кода, за исключением случаев, когда я пытаюсь сделать это изнутри контроллера WebAPI следующим образом через свойство сверху viz Global.SystemSettings:
public class EmailActivitiesController : ApiController
{
emailBody = EmailToClientsTemplateBuilderHelper.TemplateContentBuild(emailBody, Global.SystemSettings);
}
Когда я проверяю HttpContext.Current.Session, он равен NULL.
Итак, почему коллекция Session null при доступе с контроллера WebAPI?
Мне нужно хранить информацию, связанную с сеансом пользователя в контроллере WebAPI, поэтому мне нужно сейчас хранить вещи по-другому?
ОБНОВИТЬ
Принятое решение также работает для WebAPI 1, что и используется приложением.
Это связано с тем, что по умолчанию для WebApi не включен Session
. WebApi пытается побудить вас перейти к API-интерфейсам без апатии и RESTful.
Я настоятельно призываю вас переработать ваш дизайн без сеансов.
С учетом этого вы можете включить сеанс в WebApi 2, добавив его в Global.asax
protected void Application_PostAuthorizeRequest()
{
System.Web.HttpContext.Current.SetSessionStateBehavior(
System.Web.SessionState.SessionStateBehavior.Required);
}