2010-12-17 77 views
0

我創建了一個主要由JavaScript客戶端訪問的API,因此無論是否存在錯誤,每個操作都會返回Json結果。這樣,客戶端可以優雅地處理返回的任何事情,無論是在500錯誤的XHR還是200響應的返回數據有效負載。我的代碼(在MVC 2工作得很好)通常會有點像這樣:ASP.NET MVC 3 RC1爲我的500響應做了些什麼

[HttpPost] 
    public ActionResult EditName(string Name, string Id) 
    { 
     try 
     { 
      // some code here 

      Response.StatusCode = 200; 
      return Json(new APIResult(true, Name), JsonRequestBehavior.AllowGet); 
     } 
     catch (Exception ex) 
     { 
      Response.StatusCode = 500; 
      Response.StatusDescription = ex.UnRoll(); 
      return Json(new APIResult(false, ex.UnRoll()), JsonRequestBehavior.AllowGet); 
     } 
    } 

的APIResult對象和.UnRoll()方法是我自己製作的方便一致的結果結構。無論如何,當處理異常時,MVC 3 RC1中會出現問題。由於的StatusCode設置爲500,即ASP.NET處理程序做一些事情,現在,在提琴手,我可以看到的反應是:

<!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"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> 
<title>500 - Internal server error.</title> 
<style type="text/css"> 
<!-- 
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans- serif;background:#EEEEEE;} 
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;} 
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;background-color:#555555;} 
#content{margin:0 0 0 2%;position:relative;} 
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;} 
--> 
</style> 
</head> 
<body> 
<div id="header"><h1>Server Error</h1></div> 
<div id="content"> 
<div class="content-container"><fieldset> 
    <h2>500 - Internal server error.</h2> 
    <h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3> 
</fieldset></div> 
</div> 
</body> 
</html> 

我可以得到它返回正確的JSON對象是唯一的辦法將Response.StatusCode = 500;替換爲Response.StatusCode = 200;這實際上並不是我想要做的,因爲那樣它永遠不會被客戶端上的XMLHttpRequest對象處理爲真正的錯誤。

任何人都可以指出我改變了什麼,或者我現在需要改變什麼?

謝謝!

+1

您是否嘗試添加'Response.TrySkipIisCustomErrors = true;'? – Buildstarted 2010-12-17 16:45:38

回答

0

謝謝,BuildStarted,應該肯定工作。對於遇到這個問題的其他人來說,它顯然不是特定於ASP.NET MVC 3 RC1(儘管我不完全確定它爲什麼不影響我的2.0應用程序)。它顯然與IIS 7有關,一些谷歌搜索引發了另一個StackOverflow問題(IIS7 Overrides customErrors when setting Response.StatusCode?),其中有Response.TrySkipIisCustomErrors = true;建議以及另一個問題(我最終選擇了一個,因爲它不需要我編輯每個方法)您只需在Web.config文件的system.webServer部分添加httpErrors鍵即可覆蓋默認的IIS錯誤行爲。