【翻譯】ASP.NET WEB API異常處理


當一個web api拋出一個異常后

此異常會被轉化成一個HTTP響應

錯誤代碼為500的服務錯誤

但是如果你不想讓客戶端看到500的錯誤碼

你也可以自定義錯誤碼

如下代碼當用戶輸入的ID沒有與之相關的數據

則返回了錯誤碼為404的錯誤

(頁面未找到)

public Product GetProduct(int id) 
{ 
    Product item = repository.Get(id); 
    if (item == null) 
    { 
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
    } 
    return item; 
}
 

如果需要進一步自定義錯誤消息的內容

可以通過如下方法來完成

public Product GetProduct(int id) 
{ 
    Product item = repository.Get(id); 
    if (item == null) 
    { 
        var resp = new HttpResponseMessage(HttpStatusCode.NotFound) 
        { 
            Content = new StringContent(string.Format("No product with ID = {0}", id)), 
            ReasonPhrase = "Product ID Not Found" 
        } 
        throw new HttpResponseException(resp); 
    } 
    return item; 
}
 

結果如下圖所示

image

image

另外

開發人員可以托管異常的拋出

異常過濾器可以接到controller拋出的任何未處理異常,

並不單單是HttpResponseException

異常過濾器實現了System.Web.Http.Filters.IExceptionFilter接口

 using System; 
    using System.Net; 
    using System.Net.Http; 
    using System.Web.Http.Filters; 
 
    public class NotImplExceptionFilter : ExceptionFilterAttribute  
    { 
        public override void OnException(HttpActionExecutedContext context) 
        { 
            if (context.Exception is NotImplementedException) 
            { 
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); 
            } 
        } 
    } 
 

光創建了異常過濾器還不夠

還要注冊到系統中去才有效

    public class WebApiApplication : System.Web.HttpApplication
    {
        static void ConfigureApi(HttpConfiguration config)
        {
            config.Filters.Add(new HelloWebAPI.Controllers.NotImplExceptionFilter());
        } 
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            ConfigureApi(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
 

我目前還不知道怎么在這里注冊這個過濾器

image

運行的效果如下

image

image

另外

如果知識針對某個類或者某個action處理異常

也可以使用特性的寫法

        [NotImplExceptionFilter]
        public IEnumerable<Product> AllProducts()
        {
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM