- 私はMVC 4 Webアプリケーションを持っています。
- 私のiis7環境にデプロイされました。
- Windows 認証と偽装を使用します。
- 会社のポリシーにより、15 分後にセッションがタイムアウトするように設定されています。
これは、asp.net アプリケーションでは常に正常に機能しました。しかし、私は MVC4 アプリケーションを持っているので、global.asax と session_start を使用してセッションがタイムアウトしてリダイレクトされたかどうかを判断する代わりに、セッション期限切れアクション フィルターを設定しました。
ユーザーがアプリケーションをアイドル状態のままにするまで、すべてが期待どおりに機能し、セッションがタイムアウトするとリダイレクトされます。アプリプールのアイドルタイムアウトは 20 分で、ここで問題があると考えられます。
ユーザーが自分のアプリケーションを開いたままにしてよく行う会議に向かい、アイドル タイムアウトに達した場合、ユーザーが戻ってきていつかやろうとすると、アプリケーションがセッション タイムアウトでリダイレクトしようとすると、ループに閉じ込められたエラー ログが記録され、リダイレクトされることはありません。
リダイレクトを試行するには、事後 (つまり、アイドル タイムアウト) では遅すぎますか? 以前は、asp.net アプリケーション (MVC 以外) で、global.asax のセッション開始時に常にこのアクション (つまり、セッション タイムアウトでのリダイレクト) を実行していましたが、うまくいきました。明らかに、このイベントは、アプリケーションのアイドル タイムアウトが発生する前に常に発生していました。
任意の助けをいただければ幸いです。これが私のセッションハンドラーのコードです:
public class SessionExpireAttribute : ActionFilterAttribute
{
/// <summary>
/// Called by the ASP.NET MVC framework after the action method executes.
/// </summary>
/// <param name="filterContext">The filter context.</param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
///<summary>
///Called by the ASP.NET MVC framework before the action method executes.
///</summary>
///<param name="filterContext">The filter context.</param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session != null)
{
if (filterContext.HttpContext.Session.IsNewSession)
{
var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 403;
}
else
{
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "SessionTimeout");
redirectTargetDictionary.Add("controller", "Home");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}