2016-08-18 4 views
1

ASP.Net MVC 5 .Net Framework 4.6.1Session-Handling-Timeouts in Ajax-Aufrufe

I-Code nur hinzugefügt Session-Timeout zu erkennen, die funktioniert:

 public class CheckSessionTimeOutAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) 
    { 
     var context = filterContext.HttpContext; 
     if (context.Session != null) 
     { 
      if (context.Session.IsNewSession) 
      { 
       string sessionCookie = context.Request.Headers["Cookie"]; 
       if ((sessionCookie != null) && (sessionCookie.IndexOf("ASP.NET_SessionId", StringComparison.Ordinal) >= 0)) 
       { 
        string redirectTo = "~/Home/Index"; 
        filterContext.HttpContext.Response.Redirect(redirectTo, true); 
       } 
      } 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Wie Sie sehen können, ich umleiten sie auf den Startbildschirm. Ich habe meine [CheckSessionTimeOut] als Attribut auf allen relevanten Controllern. Also, ich starte die App, gehe auf eine andere Seite als den Home-Bildschirm, warte 1 Minute auf Session Timeout, der Code läuft in bestimmten Situationen wie erwartet. Fall und Punkt, ich habe ein Dropdown und wenn eine Auswahl getroffen wird, findet eine Umleitung statt. Heres das Verfahren:

$('#selusers').change(function() { 
    var rd = $(this).find("option:selected").attr('redirect'); 
    location.href = rd; 
}); 

Was hier passiert, ist, wenn ein Benutzer aus der Dropdown ausgewählt wird, wird das Attribut redirect auf dieser Person zu lesen und Umleitung erfolgt. Wenn die Sitzung abläuft, findet eine Umleitung auf den angemeldeten Benutzer statt und nicht auf den neu ausgewählten Benutzer. Das ist richtig für meine App.

Allerdings mache ich zahlreiche Ajax Anrufe in meiner App. Wenn die Sitzung abbricht und ich auf ein Element klicke, das einen Ajax-Anruf auslöst, werde ich auf den Startbildschirm umgeleitet, aber die Fehlermethode wird in der Ajax-Anfrage aufgerufen. Ich bekomme ein Popup mit dem Homescreen html darin. Hier ist ein Beispiel für einen Ajax-Anruf, den ich mache. Ich bin auf einem Bildschirm mit einer Taste speichern, die Sitzung beendet wird und dieser Code wird ausgelöst:

SaveButtonClicked: function (somedata) { 
      $.ajax({ 
       url: url, 
       type: 'POST', 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       data: JSON.stringify(some data im sending), 
       success: function (dataResult) { 
         if (!dataResult.Ok) { 
          alert("Error occurred. Please try again"); 
         } 
       }, 
       error: function (err) { 
        alert(err.responseText);//this gets called 
       } 
      }); 
     } 

ich der Standard-Alarm außer Kraft gesetzt habe, so gestylt HTML angezeigt. Das Benachrichtigungsfeld enthält den Startbildschirm html. Ich möchte das nicht. Ich möchte, dass die App auf den Startbildschirm umgeleitet wird, kein Popup. Also meine erste Frage, gibt es eine Möglichkeit, etwas auf dem Server zu tun, um zu verhindern, dass der Ajax-Aufruf seine vollständigen Methoden ausführt (dh ich möchte etwas auf dem Server tun, damit der Erfolg, der Fehler oder die vollständigen Methoden des Ajax-Aufrufs nie aufgerufen werden) Die nächste Frage, wenn die erste keine Option ist, was wäre ein sehr guter Weg, um zu erkennen, dass die Sitzung in den vollständigen Methoden eines Ajax-Anrufs abgelaufen ist, so dass der Benutzer elegant auf den Startbildschirm umgeleitet wird? Wenn es andere Wege gibt, zu tun, was ich erreichen will, habe ich nicht gefragt, bitte teile sie. Danke für das Lesen meiner Frage.

UPDATE ich die Fehlerfunktion von einem meiner Ajax-Aufrufe entnommen und stattdessen einen globalen Fehlerhandler:

$(document).ajaxError(function (e, xhr, settings) { 
     debugger; 
    }); 

Wenn nun die Session-Timeout, diese Fehler-Handler aufgerufen wird, ABER, ich schau in die xhr-Variable und es enthält die Ergebnisse des Ajax-Aufrufs und des entsprechenden HTML. Der Status ist ein 200, der statusText sagt parsererror, der ready ist eine 4. Es gibt nichts hier, das mir sagt, dass die Sitzung abgelaufen ist. Was kann ich bei der globalen ajaxError-Methode tun, um zu sagen, dass die Sitzung abgelaufen ist?

Antwort

0

Eine gute Ansatzpunkte könnten sein:

Wenn Ihre ASP.NET MVC-Projekt richtig Statuscode zurückgibt:

$.ajaxSetup({ 
    statusCode: { 
     401: function() { 
      window.location.href = "/login/path"; 
     } 
    } 
}); 

wenn nicht, können Sie versuchen:

$(document).ajaxError(function (e, xhr, settings) { 
    debugger; 
}); 

Bewertung e & xhr Eigenschaften und treffen Sie eine Entscheidung von dort.

+0

Danke für die Antwort. Ich mag diesen Ansatz. Ich implementiere bereits ajaxSetup in meiner App. Wird der statusCode in diesem Fall eine 401 sein? – BoundForGlory

+0

Ich denke schon.Wenn nicht, sollten Sie den zweiten Codeblock versuchen, um zu sehen, was beim Timeout der Sitzung zurückgegeben wird. – serhiyb

+0

Das mache ich gerade. Ich werde Sie wissen lassen, was ich finde – BoundForGlory