Asp.Net Web Api 中的異常處理

來源:互聯網
上載者:User

標籤:

本文主要參考:http://www.asp.net/web-api/overview/error-handling/exception-handling

1、如果一個Web API控制器拋出未捕獲的異常,預設情況下,大多數異常轉換成HTTP響應狀態代碼500內部伺服器錯誤。

  HttpResponseException類型是一個特例。這個異常返回任何HTTP狀態碼中指定異常建構函式。例如,下面的方法如果參數id是無效的,請求將返回404。

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

當然你還可以通過HttpResponseException來構建完整的響應訊息。

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;}

異常過濾器

你可以通過自訂一個異常過濾器來抓取所有使用者未處理的異常。當然,不包括HttpResponseException類型的異常,它是一個特例,因為它直接返回一個http訊息。

異常處理器繼承自System.Web.Http.Filters.IExceptionFilter介面。建立一個異常處理器最快的方式是繼承System.Web.Http.Filters.ExceptionFilterAttribute類,並重寫(override)OnException方法。

web api中的異常處理器和MVC中異常處理器非常類似,儘管它們來自不同的命名空間和和函數。

下面這個例子實現了一個異常過濾器,它把NotImplementedException異常轉換成http 501錯誤。

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

如何來註冊這些自訂的異常處理器呢?

系統提供了如下三種註冊方式

1、Action上註冊

public class ProductsController : ApiController{    [NotImplExceptionFilter]    public Contact GetContact(int id)    {        throw new NotImplementedException("This method is not implemented");    }}

2、控制器上註冊

[NotImplExceptionFilter]public class ProductsController : ApiController{    public Contact GetContact(int id)    {        throw new NotImplementedException("This method is not implemented");    }}

3、全域註冊

public static class WebApiConfig{    public static void Register(HttpConfiguration config)    {        config.Filters.Add(new ProductStore.NotImplExceptionFilterAttribute());        // Other configuration code...    }}

 HttpError

HttpError對象為在http響應報文中返回錯誤資訊提供一個一致的方法,下面是一個在http響應報文中返回一個404錯誤的例子:

public HttpResponseMessage GetProduct(int id){    Product item = repository.Get(id);    if (item == null)    {        var message = string.Format("Product with id = {0} not found", id);        return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);    }    else    {        return Request.CreateResponse(HttpStatusCode.OK, item);    }}

下面例子中示範如何通過HttpError返回模型驗證錯誤資訊

public HttpResponseMessage PostProduct(Product item){    if (!ModelState.IsValid)    {        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);    }    // Implementation not shown...}
HttpResponseException和HttpError一起使用
public Product GetProduct(int id){    Product item = repository.Get(id);    if (item == null)    {        var message = string.Format("Product with id = {0} not found", id);        throw new HttpResponseException(            Request.CreateErrorResponse(HttpStatusCode.NotFound, message));    }    else    {        return item;    }}

 

Asp.Net Web Api 中的異常處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.