0

我正在开发 Asp.net MVC 3 应用程序,其中我有一种在帐户控制器中注销的方法。

 public ActionResult LogOff()
        {
            try
            {
               // Session.User = null;

                this._authenticationService.SignOut();

                return RedirectToAction("Login", "Account");
            }
            catch (Exception e)
            {

                return View("Error");
            }
        }

我想从 global.asax.cs 中的 Session_End 方法调用此方法,或者是否有任何其他方法可以RedirectToAction("Login", "Account");从 global.asax.cs 文件中调用。

4

4 回答 4

0

我不知道您是否可以在当前项目中使用 signalr,但如果可以,如果会话过期,您可以使用 signalr 在客户端调用重定向。

服务器端类似的东西:

protected void Session_End()
{
    GlobalHost.ConnectionManager.GetHubContext<ConnectionStateHub>().Clients[{yourClientsId}].SessionExpired({yourRedirectTarget});
}

在客户端,类似以下的内容可以进行重定向:

var sessionHub = $.connection.sessionHub;
sessionHub.sessionExpired = function(target) { window.location = target; }
于 2013-02-14T09:45:54.683 回答
0

“Session_End”不对应任何请求或任何请求流,因此重定向/执行控制器操作不会将 HTML 返回到浏览器。只要浏览器向服务器发出请求,几乎没有机会执行“Session_End”。可能您可以使用存储在会话中的对象,当会话结束时,该对象将从会话存储中丢弃。

在 Begin_Request 事件或 MVC 中的全局过滤器中编写通用代码可以检查该对象的存在,并可以在需要时重定向用户以注销操作。

于 2013-02-13T13:31:01.150 回答
0

您需要使用基于 Ajax+JavaScript 的解决方案,只需检查可以帮助您的类似线程:

ASP.Net 中的客户端会话超时重定向

于 2013-02-13T06:20:52.630 回答
0

在 Global.asax.cs 文件中尝试这样的操作:

protected void Session_End()
    {
        // Clear the error on server. 
        Server.ClearError(); 
        Response.Clear(); 

        RouteData routeData = new RouteData(); 

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


        // Call target Controller and pass the routeData. 
        IController AccountMainController = new AccountController(); 
        AccountMainController.Execute(new RequestContext( 
                new HttpContextWrapper(Context), routeData));
    }
于 2013-02-13T06:21:06.687 回答