C#
 Computer >> コンピューター >  >> プログラミング >> C#

C# ASP.NET Web APIで未処理の例外を処理する例外フィルターの作成方法

例外フィルターとは?

ASP.NET Web APIでは、コントローラーのアクションメソッド内で発生した未処理の例外に対して、例外フィルター(Exception Filter)を使って共通のエラー処理を行うことができます。ただし、HttpResponseExceptionだけは例外的な存在です。これはHTTPレスポンスを返すことを目的として特別に設計された型のため、例外フィルターの処理対象にはなりません。

例外フィルターの基本的な作成方法

例外フィルターを実装するには、System.Web.Http.Filters.IExceptionFilterインターフェースを実装します。しかし、実際の開発では、このインターフェースがすでに実装されているSystem.Web.Http.Filters.ExceptionFilterAttributeクラスを継承し、OnExceptionメソッドをオーバーライドするのが最も簡単で一般的な方法です。

以下は、NotFiniteNumberException例外をHTTPステータスコード416(Requested Range Not Satisfiable:要求された範囲は満たせません)に変換するカスタム例外フィルターのサンプルです。

例外フィルター(ExceptionAttribute)の実装例

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

コントローラーのアクションメソッドの実装例

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

それでは、上記のExceptionAttributeの動作を確認してみましょう。アクションメソッドに対してid = 0を渡してリクエストを送信すると、NotFiniteNumberExceptionがスローされ、例外フィルターによってHTTPステータス416が返されます。

C# ASP.NET Web APIで未処理の例外を処理する例外フィルターの作成方法

例外フィルターの登録方法

作成した例外フィルターは、以下の3つの方法のいずれかで登録できます。

1. アクションメソッドに適用する

特定のアクションメソッドにのみ例外処理を適用したい場合は、メソッド単位で属性を付与します。

[Exception]
public IHttpActionResult Get(int id){
    return Ok();
}

2. コントローラークラスに適用する

コントローラー全体のすべてのアクションメソッドに適用したい場合は、クラス単位で属性を付与します。

[Exception]
public class StudentController : ApiController{
    public IHttpActionResult Get(int id){
        return Ok();
    }
}

3. WebApiConfig.csでグローバルに登録する

アプリケーション全体に適用したい場合は、WebApiConfig.csでグローバルフィルターとして登録します。

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

グローバルに登録すれば、すべてのコントローラーやアクションメソッドに自動的に適用されるため、アプリケーション全体で統一された例外処理ポリシーを実現できます。適用範囲に応じて、これら3つの方法を使い分けるのがおすすめです。

  1. C# ASP.NET WebAPIでCORSの問題を解決する方法を徹底解説

    CORS(クロスオリジンリソースシェアリング)とはクロスオリジンリソースシェアリング(Cross-Origin Resource Sharing:CORS)は、追加のHTTPヘッダーを使用して、あるオリジンで動作しているWebアプリケーションに対し、別のオリジンにある選択されたリソースへのアクセスを許可するようブラウザに指示する仕組みです。Webアプリケーションは、自身とは異なるオリジン(ドメイン、プロトコル、ポート)のリソースを要求する際に、クロスオリジンHTTPリクエストを実行します。例として、フロントエンド(UI)とバックエンド(サービス)を持つアプリケーションを考えてみましょう。フロン

  2. JavaでJTableをフィルタリングする方法!TableRowSorterとsetRowFilter()の使い方を解説

    JTableは、テーブルを柔軟に作成・表示できるSwingのコンポーネントです。テーブルの内容を扱うためのメソッドはTableModelインターフェースで定義されており、実際にはAbstractTableModelクラスを継承して独自のテーブルモデルを実装するのが一般的です。また、JTableではsetCellEditor()メソッドにTableCellEditorインターフェースの実装オブジェクトを渡すことで、セルの編集機能を追加することもできます。 テーブルの表示内容をフィルタリング(絞り込み)するには、TableRowSorterクラスのsetRowFilter()メソッドを使用します。