我开始使用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控制器中执行此操作时,通过上面的属性 Global.SystemSettings < / EM>:
public class EmailActivitiesController : ApiController
{
emailBody = EmailToClientsTemplateBuilderHelper.TemplateContentBuild(emailBody, Global.SystemSettings);
}
当我检查 HttpContext.Current.Session 时,它是 NULL 。
那么为什么从WebAPI控制器访问时Session集合为空?
我需要在WebAPI控制器中存储使用与用户会话相关的信息,所以我现在需要以不同方式存储内容吗?
更新
已接受的解决方案也适用于WebAPI 1,这是应用程序正在使用的。
答案 0 :(得分:0)
这是因为 WebApi 默认情况下未启用Session
。 WebApi 正在努力鼓励您转向无状态HTTP 和 RESTful API 。
我强烈建议您在没有会议的情况下重新设计。
有了这个说法,你可以通过将它添加到Global.asax
来启用WebApi 2中的Sessionprotected void Application_PostAuthorizeRequest()
{
System.Web.HttpContext.Current.SetSessionStateBehavior(
System.Web.SessionState.SessionStateBehavior.Required);
}