在我的控制器 C# 中设置会话
Set Session in my Controller C#
我需要在controller中设置一个session变量,发现有两种设置session的方法,
首先是 Session["SessionId"] = "Session Value";
第二个是 System.Web.HttpContext.Current.Session["SessionId"] = "Session Value";
使用第一种方式时,我必须继承: System.Web.HttpApplication
。
所以我的控制器看起来像这样 ->
public class LoginControllerWithSession : System.Web.HttpApplication
{
public Boolean userLoginSetSession(string username)
{
Session["username"] = username;
}
}
我的 web.config 看起来像这样 ->
<system.web>
<sessionState mode="InProc">
<providers>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule"
preCondition="" />
</providers>
</sessionState>
</system.web>
所以我遇到的问题是当 Session["username"] = username;
运行时抛出一个异常:Session state is not available in this context.
如果我使用另一种方式 System.Web.HttpContext.Current.Session
,它会抛出一个空指针异常。我不明白我错过了什么。我发现研究的所有内容都说只使用第一种方法:Session["SessionId"] = "Session Value";
并且应该有效,但它对我不起作用。我猜我缺少一些配置或其他什么。任何帮助将不胜感激。提前致谢!
您的 Controller 确实应该继承自 Controller。我所做的是能够轻松地构建 Session,而不会太复杂。我构建了以下内容:
public class Storage
{
public void SessionAdd(string label, string content)
{
if(string.IsNullOrEmpty(label) || string.IsNullOrEmpty(content))
return;
HttpContext.Current.Session.Add(label, content);
}
public void SessionPurge()
{
var context = HttpContext.Current;
if(context.Session != null)
context.Session.Clear();
}
}
这是一个简单的示例,但是您的 Class 将 access 到 using System.Web。这将能够正确关联 Session。这是一个例子-
重要提示:当您为 Model View Controller 构建 Session 时,您应该谨慎.它是建立在无状态的前提下的。所以添加一个 Session 可能很难跟踪,所以你最终可能会得到 流氓会话变量 ,这可能会导致潜在的问题。因此,请确保您的应用程序考虑到了这种潜力,并且您非常非常仔细地跟踪它们。
希望这对您有所帮助。
所以我找到了解决问题的办法。我将展示两个不同的文件,其中包含使 System.Web.HttpContext.Current.Session["SessionId"] = "Session Value";
正常工作的正确代码。
这是位于 App_Start 文件夹中的我的 WebApiConfig 文件:
public static class WebApiConfig
{
public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
这是 Global.asax 文件:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// starter code here
}
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
}
Application_PostAuthorizeRequest 和 IsWebApiRequest 是使用 HttpContext.Current
所必需的。如果 global.asax 中没有这些方法,您的 HttpContext.Current.Session
将始终因空指针异常而中断。
我希望这可以帮助任何遇到与我 运行 相同问题的人,因为 Session 总是抛出空指针。
我需要在controller中设置一个session变量,发现有两种设置session的方法,
首先是 Session["SessionId"] = "Session Value";
第二个是 System.Web.HttpContext.Current.Session["SessionId"] = "Session Value";
使用第一种方式时,我必须继承: System.Web.HttpApplication
。
所以我的控制器看起来像这样 ->
public class LoginControllerWithSession : System.Web.HttpApplication
{
public Boolean userLoginSetSession(string username)
{
Session["username"] = username;
}
}
我的 web.config 看起来像这样 ->
<system.web>
<sessionState mode="InProc">
<providers>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule"
preCondition="" />
</providers>
</sessionState>
</system.web>
所以我遇到的问题是当 Session["username"] = username;
运行时抛出一个异常:Session state is not available in this context.
如果我使用另一种方式 System.Web.HttpContext.Current.Session
,它会抛出一个空指针异常。我不明白我错过了什么。我发现研究的所有内容都说只使用第一种方法:Session["SessionId"] = "Session Value";
并且应该有效,但它对我不起作用。我猜我缺少一些配置或其他什么。任何帮助将不胜感激。提前致谢!
您的 Controller 确实应该继承自 Controller。我所做的是能够轻松地构建 Session,而不会太复杂。我构建了以下内容:
public class Storage
{
public void SessionAdd(string label, string content)
{
if(string.IsNullOrEmpty(label) || string.IsNullOrEmpty(content))
return;
HttpContext.Current.Session.Add(label, content);
}
public void SessionPurge()
{
var context = HttpContext.Current;
if(context.Session != null)
context.Session.Clear();
}
}
这是一个简单的示例,但是您的 Class 将 access 到 using System.Web。这将能够正确关联 Session。这是一个例子-
重要提示:当您为 Model View Controller 构建 Session 时,您应该谨慎.它是建立在无状态的前提下的。所以添加一个 Session 可能很难跟踪,所以你最终可能会得到 流氓会话变量 ,这可能会导致潜在的问题。因此,请确保您的应用程序考虑到了这种潜力,并且您非常非常仔细地跟踪它们。
希望这对您有所帮助。
所以我找到了解决问题的办法。我将展示两个不同的文件,其中包含使 System.Web.HttpContext.Current.Session["SessionId"] = "Session Value";
正常工作的正确代码。
这是位于 App_Start 文件夹中的我的 WebApiConfig 文件:
public static class WebApiConfig
{
public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
这是 Global.asax 文件:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// starter code here
}
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
}
Application_PostAuthorizeRequest 和 IsWebApiRequest 是使用 HttpContext.Current
所必需的。如果 global.asax 中没有这些方法,您的 HttpContext.Current.Session
将始终因空指针异常而中断。
我希望这可以帮助任何遇到与我 运行 相同问题的人,因为 Session 总是抛出空指针。