Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC中会话超时的处理_C#_Asp.net_.net_Asp.net Mvc_Session - Fatal编程技术网

C# ASP.NET MVC中会话超时的处理

C# ASP.NET MVC中会话超时的处理,c#,asp.net,.net,asp.net-mvc,session,C#,Asp.net,.net,Asp.net Mvc,Session,我正在开发一个MVC应用程序,我需要根据查询字符串中的几个参数将用户重定向到不同的错误页面,从而处理错误和会话超时 我面临的问题是,我试图通过将querystring中所需的参数保存到会话中,然后重定向到错误页面来实现这一点。但在控制器中的每个HttpGet和Post操作之前,我都会检查会话是否处于活动状态 因此,在会话值丢失且无法读取的情况下 如何以任何其他方式实现这一点?您需要检查会话是否存在,是否具有所需的字段以及是否处于活动状态。如果会话不存在或没有预期的字段,则处理会话不存在/过期的情

我正在开发一个MVC应用程序,我需要根据查询字符串中的几个参数将用户重定向到不同的错误页面,从而处理错误和会话超时

我面临的问题是,我试图通过将querystring中所需的参数保存到会话中,然后重定向到错误页面来实现这一点。但在控制器中的每个HttpGet和Post操作之前,我都会检查会话是否处于活动状态

因此,在会话值丢失且无法读取的情况下


如何以任何其他方式实现这一点?

您需要检查会话是否存在,是否具有所需的字段以及是否处于活动状态。如果会话不存在或没有预期的字段,则处理会话不存在/过期的情况。如果未处于活动状态,则在会话不再处于活动状态时处理该情况。如果一切正常,则正常处理请求。如果会话已过期,则将其处理为已过期。

要检查会话,您可以使用如下操作筛选器:

public class SessionActiveFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var activeSession = Session["user"];
            if (activeSession == null)
                //Here, do a redirect

            base.OnActionExecuting(filterContext);
        }
    }

此外,您还可以使用第三个选项来保存会话,如Redis Cache

我知道这是一个死故事。但我为新来者发布了这个答案。请参阅中关于如何在操作筛选器中检查会话值的nice教程

在动态web应用程序中,会话对于保存当前登录用户身份/数据的信息至关重要。因此,没有身份验证的人无法访问某个页面或任何ActionResult,要实现这种功能,我们需要检查每个需要身份验证的操作中是否存在会话(不为空)。因此,一般方法如下:

[HttpGet] 
public ActionResult Home() 
{
     if(Session["ID"] == null)
         return RedirectToAction("Login","Home"); 
}
我们每次都要检查上面的2条语句,并且在每个ActionResult中都要检查,但这可能会导致2个问题

  • 重复事情:根据好的编程规则,我们不必重复这些事情。创建一个通用代码模块并多次/重复访问
  • 代码缺失:我们必须多次编写代码,这样可能会在忘记使用某种方法编写代码或遗漏代码时发生
  • 如何避免?

    ASP.NET MVC提供了一种非常好的机制,即操作过滤器。动作过滤器是一个属性。可以将大多数操作筛选器应用于单个控制器操作或整个控制器。 如果您想了解更多有关操作筛选器的信息,请

    因此,我们将创建一个自定义操作过滤器,用于处理会话过期,如果会话为null,则重定向到登录操作

    在项目中创建新类并复制以下代码:

    namespace YourNameSpace
    {
        public class SessionTimeoutAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                HttpContext ctx = HttpContext.Current;
                if (HttpContext.Current.Session["ID"] == null)
                {
                    filterContext.Result = new RedirectResult("~/Home/Login");
                    return;
                }
                base.OnActionExecuting(filterContext);
            }
        }
    }
    
    现在我们的动作过滤器已经创建,我们已经准备好使用它了。下面的代码将向您展示如何将属性应用于操作或完成控制器

    应用于行动

    [HttpGet]
    [SessionTimeout]
    public ActionResult MyProfile()
    {
        return View();
    }
    
    应用于控制器

    [SessionTimeout]
    public class HomeController : Controller
    {
    }
    

    现在,家庭控制器的所有动作将在动作过滤器的帮助下检查会话。因此,我们减少了代码和重复的事情。这就是操作过滤器的好处。

    但我不是在寻找一种处理会话值为null的场景的方法,而是想问是否有其他方法存储用户相关数据。您可以将用户相关数据存储在数据库中签出TempData如果您想要缩进代码,请选择代码并单击
    {}
    在堆栈溢出编辑器中。不是