2013-01-11 62 views
0

我試圖用登錄方法+其他編寫API。當登錄出現問題時,我想使用自定義響應主體將自定義HTTP錯誤代碼返回給客戶端。問題在於,錯誤時請求會重定向到主頁。錯誤的MVC 3 API自定義響應正文

[HttpPost] 
[AllowAnonymous] 
public JsonResult ApiLogIn(LoginModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var outcome = _authService.LogIn(model); 

     if (outcome == LogInOutcome.Success) 
     { 
      return Json(new { }); // Empty on success 
     } 
     else 
     { 
      Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
      return Json(new { reason = outcome.ToString() }); 
     } 
    } 

    Response.StatusCode = (int)HttpStatusCode.BadRequest; 
    return Json(new { }); // Empty or invalid model 
} 

如何防止錯誤重定向?

回答

1

問題是,在請求生命週期的後期,FormsAuth模塊會檢查Response.StatusCode是否爲401,如果是,則重定向到登錄頁面。

你可以嘗試一個不同的狀態代碼(如403,被認爲不適合你的場景)。另一種選擇是延遲將Response.StatusCode設置爲401,直到Global.asax中的EndRequest事件發生。

我加入一個標記到Context.ItemsEndRequest檢查這個標誌的存在解決了這個:

的Global.asax.cs - 添加這種方法

protected void Application_EndRequest(Object sender, EventArgs e) 
{ 
    if(Context.Items["AjaxPermissionDenied"] is bool) // FormsAuth module intercepts 401 response codes and does a redirect to the login page. 
    { 
     Context.Response.StatusCode = 401; 
     Context.Response.StatusDescription = "Permission Denied"; 
     Context.Response.End(); 
     return; 
    } 
} 

在您的控制器

[HttpPost] 
[AllowAnonymous] 
public JsonResult ApiLogIn(LoginModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var outcome = _authService.LogIn(model); 

     if (outcome == LogInOutcome.Success) 
     { 
      return Json(new { }); // Empty on success 
     } 
     else 
     { 
      Context.Items["AjaxPermissionDenied"] = true; 
      return Json(new { reason = outcome.ToString() }); 
     } 
    } 

    Response.StatusCode = (int)HttpStatusCode.BadRequest; 
    return Json(new { }); // Empty or invalid model 
} 
+0

確切地說,我需要,謝謝。 – Edgar