如何在 C# ASP.NET WebAPI 中建立異常過濾器來處理未處理的異常?


當控制器方法丟擲任何未處理的異常(不是 HttpResponseException 異常)時,將執行異常過濾器。HttpResponseException 型別是一個特例,因為它專門用於返回 HTTP 響應。

異常過濾器實現 System.Web.Http.Filters.IExceptionFilter 介面。編寫異常過濾器的最簡單方法是派生自 System.Web.Http.Filters.ExceptionFilterAttribute 類並覆蓋 OnException 方法。

下面是一個將 NotFiniteNumberException 異常轉換為 HTTP 狀態程式碼 **416,請求的範圍無法滿足** 的過濾器。

**ExceptionFilterAttribute** −

示例

using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
namespace DemoWebApplication.Controllers{
   public class ExceptionAttribute : ExceptionFilterAttribute{
      public override void OnException(HttpActionExecutedContext context){
         if (context.Exception is NotFiniteNumberException){
            context.Response = new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable);
         }
      }
   }
}

**控制器 ActionMethod** −

示例

using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   [Exception]
   public class StudentController : ApiController{
      List<Student> students = new List<Student>{
         new Student{
            Id = 1,
            Name = "Mark"
         },
         new Student{
            Id = 2,
            Name = "John"
         }
      };
      public Student Get(int id){
         if(id <= 0){
            throw new NotFiniteNumberException("The Id is not valid");
         }
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

因此,讓我們透過為控制器操作方法傳遞 id = 0 來測試上述 ExceptionAttribute。

ExceptionAttribute 可以透過以下任何一種方法註冊。

  • 用異常過濾器裝飾 Action。

[Exception]
   public IHttpActionResult Get(int id){
   Return Ok();
}
  • 用異常過濾器裝飾 Controller。

[Exception]
public class StudentController : ApiController{
   public IHttpActionResult Get(int id){
      Return Ok();
   }
}
  • 在 WebApiConfig.cs 中全域性註冊異常。

public static class WebApiConfig{
   public static void Register(HttpConfiguration config){
      config.Filters.Add(new ExceptionAttribute());
   }
}

更新於: 2020-08-19

402 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.