1. ホーム
  2. c#

ASP.NET MVC 5のHttpExceptionに相当するASP.NET Coreの機能

2023-08-28 16:54:09

質問

ASP.NET MVC 5では、以下のように HttpException を HTTP コードとともに投げることができ、これは次のようなレスポンスを設定します。

throw new HttpException((int)HttpStatusCode.BadRequest, "Bad Request.");

HttpException はASP.NET Coreには存在しません。同等のコードは何ですか?

どのように解決するのですか?

自分で実装した HttpException をキャッチするミドルウェアと HttpException をキャッチし、対応するエラー応答に変換するミドルウェアをサポートします。以下に簡単な抜粋を示します。また Boxed.AspNetCore Nuget パッケージを使用することもできます。

Startup.csでの使用例

public void Configure(IApplicationBuilder application)
{
    application.UseIISPlatformHandler();

    application.UseStatusCodePagesWithReExecute("/error/{0}");
    application.UseHttpException();

    application.UseMvc();
}

拡張方法

public static class ApplicationBuilderExtensions
{
    public static IApplicationBuilder UseHttpException(this IApplicationBuilder application)
    {
        return application.UseMiddleware<HttpExceptionMiddleware>();
    }
}

ミドルウェア

internal class HttpExceptionMiddleware
{
    private readonly RequestDelegate next;

    public HttpExceptionMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await this.next.Invoke(context);
        }
        catch (HttpException httpException)
        {
            context.Response.StatusCode = httpException.StatusCode;
            var responseFeature = context.Features.Get<IHttpResponseFeature>();
            responseFeature.ReasonPhrase = httpException.Message;
        }
    }
}

HttpException

public class HttpException : Exception
{
    private readonly int httpStatusCode;

    public HttpException(int httpStatusCode)
    {
        this.httpStatusCode = httpStatusCode;
    }

    public HttpException(HttpStatusCode httpStatusCode)
    {
        this.httpStatusCode = (int)httpStatusCode;
    }

    public HttpException(int httpStatusCode, string message) : base(message)
    {
        this.httpStatusCode = httpStatusCode;
    }

    public HttpException(HttpStatusCode httpStatusCode, string message) : base(message)
    {
        this.httpStatusCode = (int)httpStatusCode;
    }

    public HttpException(int httpStatusCode, string message, Exception inner) : base(message, inner)
    {
        this.httpStatusCode = httpStatusCode;
    }

    public HttpException(HttpStatusCode httpStatusCode, string message, Exception inner) : base(message, inner)
    {
        this.httpStatusCode = (int)httpStatusCode;
    }

    public int StatusCode { get { return this.httpStatusCode; } }
}

長期的には、エラーを返すために例外を使うのはやめたほうがいいと思います。例外は、単にメソッドからエラーを返すよりも遅いのです。