0

セッションの有効期限が切れたときに、次のコードをキャッチすることがわかりました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace SuburbanCustPortal.MiscClasses
{
    public class SessionExpireFilterAttribute : ActionFilterAttribute {

        public override void OnActionExecuting( ActionExecutingContext filterContext ) {
            HttpContext ctx = HttpContext.Current;

            // check if session is supported
            if ( ctx.Session != null ) {

                // check if a new session id was generated
                if ( ctx.Session.IsNewSession ) {

                    // If it says it is a new session, but an existing cookie exists, then it must
                    // have timed out
                    string sessionCookie = ctx.Request.Headers[ "Cookie" ];
                    if ( ( null != sessionCookie ) && ( sessionCookie.IndexOf ( "ASP.NET_SessionId" ) >= 0 ) ) 
                    {
                      ctx.Response.Redirect("~/Home/Login");
                    }
                }
            }

            base.OnActionExecuting ( filterContext );
        }
    }
}

問題なく起動していますが、呼び出されたアクションはまだ実行中です。

[Authorize]
[SessionExpireFilter]
public ActionResult PrePayment(PaymentModel.PrePayment model)
{
  if (string.IsNullOrWhiteSpace(Session[SessionEnums.CurrentAccountGuid.ToString()].ToString()))
  {
    return RedirectToAction("AddCustomer", "Customer");
  }

  if (TempData["ViewData"] != null)
  {
    ViewData = (ViewDataDictionary) TempData["ViewData"];
  }

...

[SessionExpireFilter]このコードで実行されていますが、セッションが無効になっているため、問題を引き起こすメソッドの残りの部分を続行します。PrePayment返されているため、最初の行でエラーが発生します。

リダイレクトはこれを防ぐべきではありませんか?

編集 **

提案された変更を行いましたが、次のようになりました。

名前空間 SuburbanCustPortal.MiscClasses { public class SessionExpireFilterAttribute : ActionFilterAttribute {

    public override void OnActionExecuting( ActionExecutingContext filterContext ) 
    {
        HttpContext ctx = HttpContext.Current;

        // check if session is supported
        if ( ctx.Session != null ) {

            // check if a new session id was generated
            if ( ctx.Session.IsNewSession ) {

                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers[ "Cookie" ];
                if ( ( null != sessionCookie ) && ( sessionCookie.IndexOf ( "ASP.NET_SessionId" ) >= 0 ) ) 
                {
                  //ctx.Response.Redirect("~/Account/LogOn/");
                  filterContext.Result = new RedirectResult("~/Account/LogOn");
                  return;
                }
            }
        }

        base.OnActionExecuting ( filterContext );
    }
}

}

前払いは AccountScreen で呼び出されており、返品後にリロードされているようです。

4

1 に答える 1

3

これを使って:

   filterContext.Result = new RedirectResult("~/Home/Login");
   return;

それ以外の:

ctx.Response.Redirect("~/Home/Login");
于 2013-06-29T17:32:57.707 に答える