在設計ASP.NET相關程式的時候,有時候我們必須在Global.asax中加入一些自訂的程式,例如希望每次Request時只會進行一次資料庫連線的建立,則可以在Application_BeginRequest中建立資料庫連線,然後在Application_EndRequest中將連線dispose掉。而在這個階段的處理若有exception時,之前的系列文章介紹的方法將無法正確處理傳回統一的JSON格式;如果有在Global.asax中做其他的處理,也希望在這裡有exception時可以用統一的方式回傳JSON結果,那們我們必須另外在Global.asax中處理這個錯誤。
先假設我們在Global.asax.cs中加入了Application_BeginRequest方法來在Request初期處理一些事情,然後發生Exception的情況:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_BeginRequest()
{
throw new Exception("thrown by Application_BeginRequest");
}
}
這時候測試API就會出現像以下這樣的畫面如果要在Global.asax中也可以將exception以我們預期的JSON格式回傳,可以加上Application_Error:
protected void Application_Error()
{
var exception = Server.GetLastError();
if (exception == null)
{
return;
}
object exceptionToSerialize = exception.InnerException ?? exception;
Response.ContentType = "text/json";
Response.Write(
JsonConvert.SerializeObject(
ExceptionUtils.ConvertToApiResponse((Exception)exceptionToSerialize)));
Response.End();
}
JsonConvert來自Json.NET套件,ExceptionUtils.ConvertToApiResponse是之前的文章提到的將Exception轉為統一的回傳物件的方法。
如此一來就能將錯誤直接透過Response.Write寫回給瀏覽器。再次使用postman來測試時就能夠看到在Global.asax中發生錯誤時回傳我們預期的JSON內容了
{
"StatusCode": 400,
"Result": null,
"Error": {
"ErrorId": "",
"Message": "thrown by Application_BeginRequest"
}
}