web-dev-qa-db-fra.com

L'échec de la validation côté serveur ASP.NET Core provoque Microsoft.AspNetCore.Mvc.SerializableError

J'utilise l'attribut [EmailAddress] pour valider les e-mails côté serveur. Cependant, lorsque j'envoie une adresse e-mail non valide, je reçois une réponse de code d'état 400 sans message au lieu d'entrer dans ma méthode d'action et de voir une erreur ModelState.

La sortie de débogage indique simplement que Microsoft.AspNetCore.Mvc.SerializableError est levée.

Quelqu'un pourrait-il expliquer cela, s'il vous plaît?

Modèle:

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

Action:

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

Sortie de débogage:

  • Microsoft.AspNetCore.Hosting.Internal.WebHost: Informations: demande de démarrage HTTP/1.1 POST http: // localhost: 44381/api/accounts application/json 43 Microsoft .AspNetCore.Cors.Infrastructure.CorsService: Information: exécution de la stratégie réussie.
  • Microsoft.AspNetCore.Server.Kestrel: Information: ID de connexion "0HLF8QUE7VV6T", ID de demande "0HLF8QUE7VV6T: 00000004": l'application s'est terminée sans lire le corps de la demande dans son intégralité.
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Informations: Route correspondant à {action = "Authenticate", controller = "Account", page = ""}. Exécution de l'action WebApp.Controllers.AccountController.Authenticate (WebApp)
  • 'dotnet.exe' (CoreCLR: clrhost): chargé 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.1\System.Runtime.Serialization.Primitives.dll'. Symboles de chargement ignorés. Le module est optimisé et l'option de débogage "Just My Code" est activée.
  • 'dotnet.exe' (CoreCLR: clrhost): chargé 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.1\System.Data.Common.dll'. Symboles de chargement ignorés. Le module est optimisé et l'option de débogage "Just My Code" est activée.
  • Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor: Information: Exécution d'ObjectResult, écriture de la valeur de type 'Microsoft.AspNetCore.Mvc.SerializableError'.
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Information: Action exécutée WebApp.Controllers.AccountController.Authenticate (WebApp) en 78.8614ms
  • Microsoft.AspNetCore.Hosting.Internal.WebHost: Information: demande terminée dans 96.9303ms 400 application/json; charset = utf-8

Demande:

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

Le [ApiController] l'attribut fournit réponses HTTP 400 automatiques .

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

Les erreurs de validation déclenchent automatiquement une réponse HTTP 400. Le code suivant devient inutile dans vos actions:

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

Comment désactiver cette fonction

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}
18
spottedmahn