eray aydoğdu

jQuery and ASP.NET MVC fanatic.

Asp.net MVC ‘nin Jquery isteklerinde Session Timeout durumu

Şuan geliştirmekte olduğumuz projede get/post işlerinin çok büyük bir bölümü jquery ile yapılıyor. Bu senaryoda şöyle bir sorun ile karşılaştık. Session Timeout a düştüğünde jquery istekleri 503 Server error döndürüyor. Timeout durumunu handle edebilmemiz için şöyle bir yol izleyebiliriz:

Session expire durumunu kontrol edecek methodumuz:

public static bool IsSessionExpired(this HttpSessionStateBase session)
{
    if (session == null || !session.IsNewSession)
    {
        return false;
    }

    string sessionCookie = HttpContext.Current.Request.Headers["Cookie"];
    return sessionCookie != null && sessionCookie.Contains("ASP.NET_SessionId");
}

Uygulamada istediğimiz yerde kullanabilmemiz için yada direkt olarak BaseController da kullanabilmemiz için Attribute oluşturalım.


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class SessionExpireAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            HttpContext ctx = HttpContext.Current;

            if (ctx.Session != null)
            {
                if (filterContext.HttpContext.Session.IsSessionExpired())
                {
                    var viewData = filterContext.Controller.ViewData;
                    viewData.Model = username;
                    filterContext.HttpContext.Response.StatusCode = 504;
                    filterContext.Result = new ViewResult { ViewName = "SessionTimeout", ViewData = viewData };
                }
            }
        }

    }

Bundan sonra Jquery isteklerinde hata status code unun 504 olup olmadığını kontrol edelim.


   $("#NewTemplate").live("click", function () {
          if (confirmNavigation($(this))) {
              $("#selectedTemplateId").val(0);
              $.ajax({
                  type: "GET",
                  url: Urls.NewTemplate,
                  async: false,
                  cache: false,
                  success: function (cb) {
                      if (!cb) {
                          alert("Hata oluştu!");
                      }
                      else {
                          uiChanges = true;
                          $("#divTemplate").html(cb);
                      }
                  },
                  error: function (xhr, textStatus, errorThrown) {
                      redirectOnSessionTimeout(xhr.status);
                  }

              });
          }
      });

      function loadAuditTableGrid(name) {
        $("#auditTableGrid").load(
            Urls.AuditTable,
            { auditTableName: name },
            function (response, status, xhr) { redirectOnSessionTimeout(xhr.status); });
       }

      //$.getJSON
      reqJSON(Urls.CheckForActiveState, { id: selectedId},
             function (result) {
               if (!result.success)
                  $("#Message").show();
               else
                  $("#Message").hide();

                  }, function (xhr, textStatus, errorThrown) {
                            redirectOnSessionTimeout(xhr.status);
       });

      function reqJSON(url, params, success, error) {
        var CallParams = {};
        CallParams.type = params.Method || "POST";
        CallParams.url = url;
        CallParams.processData = true;
        CallParams.data = params;
        CallParams.dataType = "json";
        CallParams.success = success;
        if (error) {
            CallParams.error = error;
        }
        $.ajax(CallParams);
      }

      function redirectOnSessionTimeout(status) {
        if (status == "504") {
            location.href = Urls.SessionTimeout;
        }
     }

No Responses to “Asp.net MVC ‘nin Jquery isteklerinde Session Timeout durumu”

Bu yazıya yapılan yorumlar için RSS beslemeleri. TrackBack URL

Leave a Response