2012-10-03 5 views
7

Podczas wywoływania funkcji z ajax. Przepływ programu nie rozpoznaje sesji, która wygasła, tzn. Nie przekierowuje do strony logowania. Zamiast tego zapisuje rekord. Pracuję w C# .net mvc. Jak więc obsłużyć sesję podczas wywołania ajax? Tutaj podałem moje kody.Obsługa limitu czasu, gdy wywołanie ajax do kontrolera C# mvc nie działa

$.ajax({ 
      type: "POST", 
      url:'/Employee/SaveEmployee', 
      data: 
      { 
       Location:$("#txtLocation").val(), 
       dateApplied:$("#txtDateApplied").val(), 
       Status:$("#ddStatus").val(), 
       mailCheck:$("#ddMailCheck").val(), 
       ... 
       ... 
       ... 
      }, 
      success: function (result) 
      { 

      }, 
      error: function (msg) 
      { 
      } 
     }); 

Oto kontroler

[Authorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 

Odpowiedz

23

Wynikiem rozmowy AJAX nadal będzie prawdopodobnie skończyć pojawiające się sukcesem (choć nie martw się, to nie będzie właściwie wykonywać swoje metody działania), oraz wywołaj swój uchwyt success. Dzieje się tak dlatego, że oczekujesz kodu HTML i to właśnie otrzymujesz (chociaż wynikowy kod HTML jest prawdopodobnie Twoją stroną logowania, a nie żądanym kodem HTML). Na marginesie, jeśli oczekiwałeś JSON (używając dataType:'JSON'), wywołałoby to błąd, ponieważ parsował HTML jako JSON.

Należy uniemożliwić FormsAuth przekierowanie strony logowania do żądań AJAX. Teraz AuthorizeAttribute wiernie zwraca NotAuthorizedResult, która wysyła do klienta nieautoryzowaną odpowiedź HTTP 401, która jest idealna dla klienta AJAX.

Problem polega na tym, że moduł FormsAuth sprawdza kod stanu, a jeśli jest to 401, wykonuje przekierowanie. Mam zwalczać ten problem w następujący sposób:

1) Utwórz własny typ pochodny z AuthorizeAttribute że umieszcza flagę w HttpContext.Items aby dać mi znać, autoryzacja nie powiodła się, a powinno wymusić 401 zamiast przekierowania:

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// Processes HTTP requests that fail authorization. 
    /// </summary> 
    /// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param> 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true; 

     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

2) Dodaj do Global.asax.cs:

protected void Application_EndRequest(Object sender, EventArgs e) 
    { 
     if (Context.Items["AjaxPermissionDenied"] is bool) 
     { 
      Context.Response.StatusCode = 401; 
      Context.Response.End(); 
     } 
    } 

3) Dodać do obsługi StatusCode konfiguracji jQuery AJAX:

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

4) Zmień kontrolerów lub czynności, gdzie chcesz to zachowanie z użyciem AuthorizeAttribute do AjaxAuthorizeAttribute:

[AjaxAuthorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 
+0

Właściwie moja obecna klasa wygląda następująco "public class EmployeeController: Controller". Czy chcesz poinstruować mnie, aby zmienić tak, jak po "publicznej klasie AjaxAuthorizeAttribute: AuthorizeAttribute" ???? –

+1

Po prostu zamień 'AuthorizeAttribute' na' AjaxAuthorizeAttribute', który udekorowałeś na swoich kontrolerach lub działaniach kontrolera. Zobacz # 4, które właśnie dodałem. – HackedByChinese

+0

Przepraszam, czy możesz mi wyjaśnić, gdzie muszę utworzyć klasę "public class AjaxAuthorizeAttribute: AuthorizeAttribute" ?? –

1

Chciałbym sugguest używanie StatusCode = 306. poznałem jakiś problem, gdy zastosowanie 401. IIS traktować 401 różni się od tego, co rozumiem. 306 działa dobrze dla mnie.

Pozdrawiam.

Powiązane problemy