2013-02-11 159 views
0

我有一個asp.net MVC Web應用程序,它利用jQuery進行多個Ajax調用。 ajax調用Controller來捕獲存儲過程中引發的各種驗證異常。當在過程中發現驗證例外,我用下面的語法ASP.NET MVC jQuery Ajax錯誤/異常處理

RAISERROR ('VALIDATION ERROR: xyx is required.', 16, 1) 

我的MVC控制器則抓住了SQL例外,在那裏我做了一些記錄,然後重新拋出一個新的異常(e.Message)。

catch (SqlException se) 
{ 
    // logging happens 

    // exception get rethrown for ajax error handling 
    throw new Exception(se.Message); 
} 

從那裏,我的ajax錯誤處理程序接管。

error: function(jqXHR, textStatus, errorThrown) {} 

在我的本地Visual Studio服務器的Ajax錯誤處理程序檢索以下jqXHR.responseText的所需

<html> 
<head> 
    <title>VALIDATION ERROR: xyx is required.</title> 
</head> 
.... 

從那裏我解析標題和顯示驗證錯誤。很棒。

然而,當我在我的代碼部署到我收到的jqXHR.responseText一個通用的500響應託管的IIS服務器:

<html> 
<head> 
    <title>Runtime Error</title> 
</head> .... 

出於某種原因,我的共享督促服務器不同的處理異常。你知道我怎樣才能讓這兩種環境產生第一種行爲?

我試圖加入我的web.config以下行,但沒有運氣

<httpErrors errorMode="Custom" existingResponse="PassThrough"> 
    <remove statusCode="404" subStatusCode="-1" /> 
    <remove statusCode="502" subStatusCode="-1" /> 
    <remove statusCode="501" subStatusCode="-1" /> 
    <remove statusCode="500" subStatusCode="-1" /> 
</httpErrors> 

在此先感謝

回答

0

正確設置錯誤MVC處理是平衡的行爲進行排序,至少它一直爲我服務。在我的情況下,我最終定義了<system.web><customErrors><system.webServer><httpErrors>中的自定義錯誤消息。然後當然我不得不默認ErrorHandler(或在我的情況ElmahErrorHandler)在Global.asax

我不會假裝完全理解,但我反而會告訴你我所用。 我以爲我的應用程序中有多一塊,但目前我找不到它,您可能會猜到它們的內容,它們大多是靜態HTML,但可能有一個模型的500例外。在這種情況下,我根據當前用戶角色輸出一些更詳細的錯誤信息。

我還必須解鎖machine.config的httpErrors節點,以便應用程序能夠通過web.config定義它自己的自定義錯誤路徑。您仍然可以通過IIS管理工具(與web.config相比)設置自己的設置,但實際上通過匹配應用的ID將其寫入machine.config

的web.config

<system.web> 
    <customErrors mode="RemoteOnly"> 
     <!-- Off, RemoteOnly, On --> 
     <error statusCode="400" redirect="~/errors/badrequest"/> 
     <error statusCode="404" redirect="~/errors/notfound"/> 
     <error statusCode="403" redirect="~/errors/forbidden"/> 
     <error statusCode="500" redirect="~/errors/exception"/> 
    </customErrors> 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="DetailedLocalOnly"> 
     <!-- Detailed, DetailedLocalOnly, Custom --> 
     <remove statusCode="400" subStatusCode="-1"/> 
     <error statusCode="400" path="/errors/badrequest" responseMode="ExecuteURL"/> 
     <remove statusCode="403" subStatusCode="-1"/> 
     <error statusCode="403" path="/errors/forbidden" responseMode="ExecuteURL"/> 
     <remove statusCode="500" subStatusCode="-1"/> 
     <error statusCode="500" path="/errors/exception" responseMode="ExecuteURL"/> 
     <remove statusCode="404" subStatusCode="-1"/> 
     <error statusCode="404" path="/errors/notfound" responseMode="ExecuteURL"/> 
    </httpErrors> 
</system.webServer> 

全球。ASAX

filters.Add(new Elmah.Contrib.Mvc.ElmahHandleErrorAttribute()); 
// -- OR -- 
filters.Add(new HandleErrorAttribute()); 

誤差控制器

[AllowAnonymous] 
public class ErrorsController : WimsController 
{ 
    public ActionResult Index() 
    { 
     return RedirectToAction("Index", "Home"); 
    } 

    public ActionResult Exception(HandleErrorInfo error = null) 
    { 
     return View("Error_500", error); 
    } 

    public ActionResult NotFound() 
    { 
     return View("Error_404"); 
    } 

    public ActionResult Forbidden() 
    { 
     return View("Error_403"); 
    } 

    public ActionResult BadRequest() 
    { 
     return View("Error_400"); 
    } 
}