Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

ASP.NET Core リクエストパラメーターがないエラーの対応方法

ASP.NET Core の APIコントローラーで、リクエストパラメーターが存在しないとエラーになることがありました。

以下に詳細と対応方法を記載していきます。

プロジェクトの概要

動作確認のために作成したプロジェクトは以下の通りです。

プロジェクトの作成方法は、こちら に記載しています。

目次

  1. エラーの詳細
  2. 対応方法

1. エラーの詳細

1.1. ソース

エラーが発生した APIコントローラーは以下の通りです。

Controllers/RequiredParamController.cs

using Microsoft.AspNetCore.Mvc;

namespace WebApiSample.Controllers {
  [ApiController]
  public class RequiredParamController : ControllerBase {
    [HttpGet("/req/name")]
    public Dictionary<string, string> Get(string name) {
      return new Dictionary<string, string>() {
        { "name", name }
      };
    }
  }
}

1.2. エラーになるリクエス

コントローラーの引数に設定されるパラメーターが存在しないか、値が空のリクエストでエラーが発生しました。

http://localhost:5020/req/name
http://localhost:5020/req/name?name=

※ ポート番号はデバッグ実行時のものです。

1.3. エラー内容

リクエストに対するエラー内容(レスポンス)は以下の通りです。

{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-1f7382e61a26853a630258f094c15971-53389649c932488b-00","errors":{"name":["The name field is required."]}}

name が必須入力とのことです。

2. 対応方法

2.1. 引数をnull許容型にする方法

コントローラーの引数の型に「?」を付けると、null が認められてエラーが発生しなくなります。

変更前

string

変更後

string?

Controllers/RequiredParamController.cs

using Microsoft.AspNetCore.Mvc;

namespace WebApiSample.Controllers {
  [ApiController]
  public class RequiredParamController : ControllerBase {
    [HttpGet("/req/name")]
    public Dictionary<string, string> Get(string? name) {
      return new Dictionary<string, string>() {
        { "name", name }
      };
    }
  }
}

2.2. プロジェクトの設定を変更する方法

プロジェクトのプロパティを開いて、「Null 許容」を「無効化」に設定します。

この方法だと、コードを変更せずにエラーが解消されます。

2.3. 動作確認

上のいずれかの対応を行うと、パラメーターがないリクエストに対して、以下の JSONが返却されます。

{"name":null}