web-dev-qa-db-ja.com

ASP.NET Coreサーバー側の検証エラーにより、Microsoft.AspNetCore.Mvc.SerializableErrorが発生します

[EmailAddress]属性を使用して、サーバー側で電子メールを検証します。ただし、無効な電子メールアドレスを送信すると、アクションメソッドにアクセスしてModelStateエラーが表示される代わりに、メッセージのない400ステータスコードの応答が返されます。

デバッグ出力は、Microsoft.AspNetCore.Mvc.SerializableErrorがスローされたことを示すだけです。

誰もこれを説明できますか?

モデル:

public class LoginVm
{
    [Required(ErrorMessage = "Email cannot be empty.")]
    [EmailAddress(ErrorMessage = "Email has an incorrect format.")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Password cannot be empty.")]
    public string Password { get; set; }
}

アクション:

[AllowAnonymous]
    [HttpPost]
    public IActionResult Authenticate([FromBody]LoginVm loginVm)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (loginVm.Email != "[email protected]" || loginVm.Password != "password")
        {
            return NotFound("There is no such user.");
        }

        return Ok();
    }

デバッグ出力:

  • Microsoft.AspNetCore.Hosting.Internal.WebHost:Information:HTTP/1.1からのリクエストPOST http:// localhost:44381/api/accounts application/json 43 Microsoft .AspNetCore.Cors.Infrastructure.CorsService:情報:ポリシーの実行に成功しました。
  • Microsoft.AspNetCore.Server.Kestrel:情報:接続ID "0HLF8QUE7VV6T"、要求ID "0HLF8QUE7VV6T:00000004":要求本文全体を読み取らずにアプリケーションが完了しました。
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:情報:{action = "Authenticate"、controller = "Account"、page = ""}と一致するルート。アクションの実行WebApp.Controllers.AccountController.Authenticate(WebApp)
  • 「dotnet.exe」(CoreCLR:clrhost):「C:\ Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.1\System.Runtime.Serialization.Primitives.dll」がロードされました。シンボルの読み込みをスキップしました。モジュールが最適化され、デバッガーオプション「Just My Code」が有効になります。
  • 「dotnet.exe」(CoreCLR:clrhost):「C:\ Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.1\System.Data.Common.dll」をロードしました。シンボルの読み込みをスキップしました。モジュールが最適化され、デバッガーオプション「Just My Code」が有効になります。
  • Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor:情報:ObjectResultを実行し、「Microsoft.AspNetCore.Mvc.SerializableError」タイプの値を書き込みます。
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:情報:78.8614msで実行されたアクションWebApp.Controllers.AccountController.Authenticate(WebApp)
  • Microsoft.AspNetCore.Hosting.Internal.WebHost:情報:要求は96.9303ms 400 application/jsonで終了しました。 charset = utf-8

リクエスト:

POST http://localhost:58072/api/accounts HTTP/1.1
Host: localhost:58072
Connection: keep-alive
Content-Length: 47
Accept: application/json, text/plain, */*
Origin: https://localhost:44381
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Content-Type: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

{"email":"wrongemail","password":"wrongpassword"}
8
Maksym Lapshyn

[ApiController]属性は、 自動HTTP 400応答 を提供します。

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase

検証エラーは自動的にHTTP 400応答をトリガーします。次のコードはアクションで不要になります。

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

この機能をオフにする方法

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });

    ...
}
18
spottedmahn