C# 使用数据库中的注销记录并删除Global.asax中会话_End()后面的cookie

C# 使用数据库中的注销记录并删除Global.asax中会话_End()后面的cookie,c#,cookies,dependency-injection,asp.net-mvc-5,session-timeout,C#,Cookies,Dependency Injection,Asp.net Mvc 5,Session Timeout,我在一个项目中需要帮助,我要绞尽脑汁两天。我正在使用Microsoft C#MVC5技术和框架4.5,还使用实体框架6和存储库模式、工作单元和Unity来实现依赖注入 我有一个名为AccountController的控制器,负责在系统上执行用户登录和注销,该控制器通过应用同一个构造函数的依赖项注入来接收存储库的方法 会计控制员 只有当超时发生并且我使用Global.asaxSession\u End()方法时,我才能访问存储库和表单验证 我已尝试使用以下代码将会话\u End()重定向到Acti

我在一个项目中需要帮助,我要绞尽脑汁两天。我正在使用Microsoft C#MVC5技术和框架4.5,还使用实体框架6和存储库模式、工作单元和Unity来实现依赖注入

我有一个名为AccountController的控制器,负责在系统上执行用户登录和注销,该控制器通过应用同一个构造函数的依赖项注入来接收存储库的方法

会计控制员 只有当超时发生并且我使用Global.asax
Session\u End()
方法时,我才能访问存储库和
表单验证

我已尝试使用以下代码将
会话\u End()
重定向到ActionResult注销

RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Account");
routeData.Values.Add("action", "Login");

IController AccountMainController = new AccountController();
AccountMainController.Execute(new RequestContext(
    new HttpContextWrapper(HttpContext.Current), routeData));
但是,当通过行
AccountMainController.Execute(newrequestcontext(newhttpcontextwrapper(HttpContext.Current),RouteData)时;引发ArgumentNullException类型的异常:“值不能为null参数名称:httpContext


我想知道我必须做些什么才能在
会话结束()中重复我通过单击注销按钮所做的事情。有人能帮忙吗?

经过大量研究,我得出结论,不可能像我在
会话结束()中单击按钮时那样执行“注销”
,我安排在超时事件后清除cookie的方式是在
会话\u Start()
中编写以下代码



    protected void Session_Start()
    {
        try
        {
            var usuario = new SessionContext().GetUserData();

            if (usuario == null) return;

            Session.Clear(); //Pode não ser necessário, mas não é problemático o uso como prevenção
            Session.Abandon();

            //Limpar o cookie de Autenticação
            var resetFormsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
            resetFormsCookie.Expires = DateTime.Now.AddYears(-1);
            Response.Cookies.Add(resetFormsCookie);

            //Limpar a session cookie
            var resetSessionCookie = new HttpCookie("ASP.NET_SessionId", "");
            resetSessionCookie.Expires = DateTime.Now.AddYears(-1);
            Response.Cookies.Add(resetSessionCookie);

            //Invalida o Cache no lado do Cliente
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetNoStore();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            Response.RedirectToRoute("Default");
        }
    }



    protected void Session_End()
    {
        Session.Clear();
        Session.Abandon();
    }

作为预防,我在
Session\u End()
中编写了以下代码



    protected void Session_Start()
    {
        try
        {
            var usuario = new SessionContext().GetUserData();

            if (usuario == null) return;

            Session.Clear(); //Pode não ser necessário, mas não é problemático o uso como prevenção
            Session.Abandon();

            //Limpar o cookie de Autenticação
            var resetFormsCookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
            resetFormsCookie.Expires = DateTime.Now.AddYears(-1);
            Response.Cookies.Add(resetFormsCookie);

            //Limpar a session cookie
            var resetSessionCookie = new HttpCookie("ASP.NET_SessionId", "");
            resetSessionCookie.Expires = DateTime.Now.AddYears(-1);
            Response.Cookies.Add(resetSessionCookie);

            //Invalida o Cache no lado do Cliente
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetNoStore();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            Response.RedirectToRoute("Default");
        }
    }



    protected void Session_End()
    {
        Session.Clear();
        Session.Abandon();
    }


我想你看到了试图跟踪暂时和无状态的事物的固有问题。我会采取不同的方法跟踪“最后一次看到”而不是试图跟踪“注销”。当发出请求时,更新“最后一次看到”“对于用户。如果他们关闭浏览器,这个日期/时间与他们离开的时间相当准确。你能给我看一些代码,让我解释一下你在说什么吗?