为什么HttpContext比直接访问Session变量更好

本文关键字:Session 变量 更好 访问 HttpContext 为什么 | 更新日期: 2023-09-27 18:10:18

可以看到下面的代码

[HttpPost]
public ActionResult RemoveFromCart(int id)
{
     // Remove the item from the cart
     var cart = ShoppingCart.GetCart(this.HttpContext);

...
public static ShoppingCart GetCart(HttpContextBase context)
{
    var cart = new ShoppingCart();
    cart.ShoppingCartId = cart.GetCartId(context);
    return cart;
}

// We're using HttpContextBase to allow access to cookies.
public string GetCartId(HttpContextBase context)
{
   if (context.Session[CartSessionKey] == null)
   {
       if (!string.IsNullOrWhiteSpace(context.User.Identity.Name))
       {
            context.Session[CartSessionKey] = context.User.Identity.Name;
       }
       else
       {
             // Generate a new random GUID using System.Guid class
             Guid tempCartId = Guid.NewGuid();
             // Send tempCartId back to client as a cookie
             context.Session[CartSessionKey] = tempCartId.ToString();
        }
   }
   return context.Session[CartSessionKey].ToString();
}

那么为什么我们不能直接使用Session[CartSessionKey]呢?

[HttpPost]
public ActionResult RemoveFromCart(int id)
{
     // Remove the item from the cart
     var cart =  Session[CartSessionKey].ToString();

为什么HttpContext比直接访问Session变量更好

没有实质性的区别。Controller上的Session属性实现为:

if (this.HttpContext != null)
    return this.HttpContext.Session;
else
    return null;

这是一个方便的属性,所以用哪个都没关系。

使用上下文可以保证您正在访问正确的会话。在使用会话之前,您应该始终检查会话是否为空。这是很好的编码实践。快捷方式是懒惰的,会导致错误,是不好的做法。