gpt4 book ai didi

c# - 为什么使用 HttpContext 的 MVC 4 session 助手工作而 HttpContextBase 不工作?

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:40 27 4
gpt4 key购买 nike

我基于以下示例实现了一个 session 助手来保存和检索 session 变量:(我尽量减少 session 变量的使用) Stackoverflow question

我在 Visual Studio 2012 上使用 MVC 4 和目标 .NET 4.5。

我实现了一个二传手。这个使用 HttpContextBase(即 controller.HttpContext):

public class HttpContextBaseSessionHelper : ISessionHelper
{
private readonly HttpContextBase _context;

public HttpContextBaseSessionHelper(HttpContextBase context)
{
_context = context;
}

public T Get<T>(string key)
{
object value = _context.Session[key];
return value == null ? default(T) : (T)value;
}

public void Set<T>(string key, T value)
{
_context.Session[key] = value;
}
}

此实现使用 HttpContext(即 System.Web.HttpContext.Current):

public class HttpContextSessionHelper : ISessionHelper
{
private readonly HttpContext _context;

public HttpContextSessionHelper(HttpContext context)
{
_context = context;
}

public T Get<T>(string key)
{
object value = _context.Session[key];
return value == null ? default(T) : (T)value;
}

public void Set<T>(string key, T value)
{
_context.Session[key] = value;
}
}

在 Controller 中,HttpContext 属性的类型为 HttpContextBase (Controller.HttpContext)。我可以模拟(使用 Moq)基于 HttpContextBase 的 ISessionHelper。

我使用以下两个 Controller 操作来查看正在运行的应用程序(不是单元测试)是否设置和检索了正确的值:

public ActionResult SessionSet()
{
_sessionHelper.Set<string>("TestKey", "TestValue");
ViewBag.SessionValue = (string)HttpContext.Session["TestKey"];
return View();
}

public ActionResult SessionGet()
{
HttpContext.Session["TestKey"] = "TestValue";
ViewBag.SessionValue = _sessionHelper.Get<string>("TestKey");
return View();
}

此实现在使用上述操作时抛出 NullReference 异常:

_sessionHelper = new HttpContextBaseSessionHelper(HttpContext);

但是这个实现工作得很好:

_sessionHelper = new HttpContextSessionHelper(System.Web.HttpContext.Current);

我的问题是为什么会这样?使用 HttpContextBase 的实现不应该工作,而使用 HttpContext 的实现是否会出现问题,因为 Controller.HttpContext 返回一个 HttpContextBase 类型?

最佳答案

This implementation throws a NullReference exception when using the above actions:

_sessionHelper = new HttpContextBaseSessionHelper(HttpContext);

您已将此代码放入 Controller 的构造函数中,对吗?那行不通,因为 HttpContext属性在此阶段尚未初始化。您应该将此代码放在 Initialize 中方法,如果你想访问任何 HttpContext 相关的属性:

protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
_sessionHelper = new HttpContextBaseSessionHelper(HttpContext);
}

评论您问题中的以下句子:

I try to minimize the use of session variables

您不应该试图尽量减少 session 变量的使用。您应该尝试从您的应用程序中完全删除任何 ASP.NET session 。

关于c# - 为什么使用 HttpContext 的 MVC 4 session 助手工作而 HttpContextBase 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com