真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在ASP.NETWebAPI中使用Attribute統(tǒng)一處理異常-創(chuàng)新互聯(lián)

并非所有的異常都需要 try-catch 進行重復(fù)的處理,這會導(dǎo)致大量的重復(fù)性代碼,一旦后續(xù)系統(tǒng)出現(xiàn)異常處理機制的修改,隨著代碼量增多,修改也會變的更加困難。

創(chuàng)新互聯(lián)秉承實現(xiàn)全網(wǎng)價值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都做網(wǎng)站、成都網(wǎng)站制作,微信平臺小程序開發(fā),網(wǎng)頁設(shè)計制作,手機網(wǎng)站開發(fā),成都營銷網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對客戶都以感恩的心態(tài)奉獻自己的專業(yè)和所長。

ASP.NET Web API 中特別增加了全局異常過濾器功能,諸如于此的還有很多過濾器可供開發(fā)者選擇,以實現(xiàn)面向切面編程,它們在取代重復(fù)性編碼這一目標(biāo)的路上,作出很多貢獻,同時降低了后期維護代碼的難度,提升了可讀性。

大多數(shù)異常處理的 try-catch 都通常是同樣的寫法(記錄異常日志、返回錯誤信息等),因此我們可以將他們統(tǒng)一寫在一個過濾器中,讓 API 在出現(xiàn)異常時,即使沒有使用 try-catch 嵌套異常位置和解決方案,也能夠自動進入期望的異常處理方法。

注意:這是專門針對 Web API 所使用的全局異常處理器。如果是 Controller,則它有另外一套全局異常處理機制,因為通常情況下 MVC 的控制器不只返回Json字符串,通常要涉及頁面View,文件File,Json字符串等。

Get Start

下面我們以一個最簡單的異常處理過濾器代碼為例,來說明應(yīng)當(dāng)如何使全局異常處理器生效:

1.創(chuàng)建一個類 MyExceptionFilterAttribute,繼承 ExceptionFilterAttribute, System.Web.Mvc.IExceptionFilter 并實現(xiàn)接口方法

using Newtonsoft.Json;
using System.Net.Http;
using System.Web.Http.Filters;
using System.Web.Mvc;

namespace WebAPITest.Filters
{
public class MyExceptionFilterAttribute : ExceptionFilterAttribute, System.Web.Mvc.IExceptionFilter
{
//MVC過濾器要求必須繼承此接口才允許注冊,但我們可以繼承、實現(xiàn)但不寫它。
public void OnException(ExceptionContext filterContext)
{
? throw new NotImplementedException();
}

//真正能讓API全局異常過濾器在出現(xiàn)異常時生效的是這個家伙:
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
? base.OnException(actionExecutedContext);

actionExecutedContext.Response = new HttpResponseMessage() { Content = new StringContent("出現(xiàn)異常") };
? return;

}

}

2.為此全局異常處理器進行注冊:

打開文件夾 App_Start 下的 FilterConfig.cs 為過濾器注冊,由此才能使得過濾器生效。

特別說明:一旦進行了全局注冊,則所有方法出現(xiàn)異常時,過濾器都會生效。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyExceptionFilterAttribute());
}

作為特性標(biāo)簽使用

當(dāng)然,上述 MyExceptionFilterAttribute 除了可注冊為全局異常過濾器以外,也可以單獨為 API 中的某些方法使用:(注意,方法本身就是"try",過濾器是"catch"。所以不再需要在方法體內(nèi)再次 try-catch)

using System.Net.Http;
using System.Web.Http;
using WebAPITest.Filters;
using WebAPITest.Models;

namespace WebAPITest.Controllers
{
//你也可以把過濾器標(biāo)簽打在這個地方,這代表該API類下的所有接口均接受[MyExceptionFilter]接管異常處理。
public class TestController : ApiController
{
[MyExceptionFilter]???? //特性標(biāo)簽打在此處,則 UserException 方法出現(xiàn)異常時會觸發(fā) MyExceptionFilterAttribute 中的異常處理方法。
public HttpResponseMessage UserException()
{
? throw new UserException("用戶異常");
}

[MyExceptionFilter]???? //同上,這一特性標(biāo)簽將幫助 SystemException 方法處理異常。
public HttpResponseMessage SystemException()
{
? throw new Exception();
}

}
}

標(biāo)簽與全局注冊的優(yōu)先級問題

多個特性標(biāo)簽,可以全局注冊,可以單獨在方法名稱上、類名上混合使用,那么如果一個標(biāo)簽被全局注冊,另一個標(biāo)簽被單獨打在方法名上或者類名上,則最終哪一個處理器的方法會被觸發(fā)?

這些家伙的優(yōu)先級其實和 css 層疊樣式表的優(yōu)先級相仿。

即:如果我們?nèi)肿赃^一個過濾器A,又在 ApiController 類的最頂端打了另外一個B、又在Action方法上打了第三個異常處理器C,那么默認(rèn)只會執(zhí)行最靠近 Action 的C處理器,也就是說:ActionFilter > ClassFilter > GlobalFilter。

另外如果需要多次執(zhí)行全部生效,即:全局一次,Controller類一次,Action一次,那么則需要為過濾器頂端加那么一個標(biāo)簽 [AttributeUsage(AttributeTargets.All,AllowMultiple = true)],然后當(dāng)異常觸發(fā)時,他們就能夠支持多次執(zhí)行。

當(dāng)然,真正的異常處理還會涉及很多復(fù)雜的內(nèi)容,這只是一個概覽。例如返回值需要被標(biāo)準(zhǔn)化(包含狀態(tài)碼、消息、響應(yīng)流等內(nèi)容),調(diào)用異常處理工具向服務(wù)器發(fā)送異常信息記錄,記錄請求參數(shù),對GET/POST請求導(dǎo)致異常的差異化處理方法等。

但我們在這里提供的是一個思路,讓你知道,精簡代碼、提升開發(fā)效率其實可以有更多的方法和可能性。而不必非要使用同一種方式,當(dāng)你覺得某些步驟一直在不斷重復(fù),則應(yīng)當(dāng)已經(jīng)有早期的開發(fā)者給出了解決方案,而你需要去發(fā)現(xiàn)他們。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。


名稱欄目:在ASP.NETWebAPI中使用Attribute統(tǒng)一處理異常-創(chuàng)新互聯(lián)
當(dāng)前地址:http://weahome.cn/article/dpopeo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部