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;
        }
     }

Gözüküp Saklanabilir Pop-up

İşlerin yoğunluğundan ikinci plana attığım blog yazılarına nihayet uzun bi aradan sonra dönüş yapıyorum. Bundan sonra işlerim ne kadar yoğun olursa olsun blog yazılarına zaman ayırmaya çalışacağım. Hızlı ve kısa blog yazıları yolda demek oluyor bu…

Yakın zamanda bir projede ihtiyacım olan bir jquery plug-ini göstereceğim. Adı Meerkat sitede tanıtılandan çok enteresanfarklı bir yerde kullandım ancak ihtiyacınıza çok farklı durumdalarda işe yarayabilir.

Sitesinde de inceleyebileceğiniz gibi ekranın 4 tarafında bir çeşit pop-up açabiliyor, en önemlisi bunu yanlızca tek sefer gösterebiliyorsunuz (Browser session ı sonlanana kadar).

Kullanımına şu şekilde göz atalım:

Öncelikle jquery kütüphanesini ve tabi merkaat ı çağırıyoruz.

<script src="jquery.min.js" type="text/javascript"></script>
<script src="jquery.meerkat.js" type="text/javascript"></script>

Merkaat ın çalışması için gerekli HTML kodlarımızı da aşağıdaki gibi ayarlıyoruz. Gerekli olan html elemanları body etiketinin kapanmasından hemen öncesine classı merkaat olan bir div yerleştiriyoruz.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>Meerkat: A jQuery Plugin (Basic Demo)</title>
  <script src="jquery.min.js" type="text/javascript"></script>
  <script src="jquery.meerkat.js" type="text/javascript"></script>
  <script type="text/javascript">
     $(document).ready(function(){
        //Meerkat
     });
  </script>
</head>
<body>
  <div id="wrapper">
      Web sayfa içeriği burada
  </div>
  <div>
      Meerkat içeriği burada
  </div>
</body>
</html>

Şimdi merkaat kodlarını document ready ye ekleyelim.

$('.meerkat').meerkat({
     background: 'url(images/meerkat-bot-bg.png) repeat-x left top',
     height: '120px',
     width: '100%',
     position: 'bottom',
     close: '.close-meerkat',
     dontShowAgain: '.dont-show',
     animationIn: 'slide',
     animationSpeed: 500
});

Dökümantasyon dosyası ingilizce ancak bilmesenizde belli başlı ayarlar için yardımcı olacaktır. Onun dışında takıldığınız veya sormak istedikleriniz için yorum yazarsanız yardımcı olmaya çalışırım.