Récemment, lors de la migration de notre projet de .NET 6 vers .NET 8, mon coéquipier Jeremy Chan a découvert un changement non documenté dans le comportement de liaison de modèle qui semble apparaître depuis .NET 7. Ce changement n'est pas clairement expliqué dans le .NET officiel. documentation, cela peut donc être quelque chose que les développeurs négligent facilement.
Pour illustrer le problème, commençons par un simple projet d'API Web et explorons une méthode de contrôleur simple qui met en évidence le changement.
[ApiController] public class FooController { [HttpGet()] public async void Get([FromQuery] string value = "Hello") { Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; } }
Ensuite, nous supposons que nullable est activé dans les projets .NET 6 et .NET 8.
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <Nullable>enable</Nullable> ... </PropertyGroup> ... </Project>
Dans .NET 6, lorsque nous appelons le point de terminaison avec /foo?value=, nous recevrons l'erreur suivante.
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-5bc66c755994b2bba7c9d2337c1e5bc4-e116fa61d942199b-00", "errors": { "value": [ "The value field is required." ] } }
Cependant, si nous modifions la méthode comme suit, l'erreur ne sera pas là.
public async void Get([FromQuery] string? value) { if (value is null) Console.WriteLine($"Value is null!!!"); else Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; }
Le journal lors de l'appel du point de terminaison avec /foo?value= sera alors « La valeur est nulle !!! ».
Par conséquent, nous pouvons savoir que la chaîne de requête sans valeur sera interprétée comme étant nulle. C'est pourquoi il y aura une erreur de validation lorsque la valeur n'est pas nullable.
Ainsi, nous pouvons dire que, pour que le point de terminaison fonctionne dans .NET 6, nous devons le modifier comme suit pour rendre la valeur facultative. Cela ne marquera pas la valeur comme champ obligatoire.
public async void Get([FromQuery] string? value = "Hello")
Maintenant, si nous appelons le point de terminaison avec /foo?value=, nous recevrons le journal « Value is Hello » imprimé.
Alors que diriez-vous de .NET 8 avec la même configuration d'origine, c'est-à-dire comme indiqué ci-dessous.
public async void Get([FromQuery] string value = "Hello")
Dans .NET 8, lorsque nous appelons le point de terminaison avec /foo?value=, nous verrons le journal « Value is Hello » imprimé.
Alors, que se passe-t-il ici ?
Dans .NET 7, une nouvelle interface IParsable a été introduite. Ainsi, à partir de .NET 7, l'API IParsable.TryParse est utilisée pour lier les valeurs des paramètres d'action du contrôleur.
Les recherches initiales montrent que, sous le capot, à partir de .NET 7, la nouvelle implémentation de liaison de modèle est utilisée et cela provoque cela.
KOSD, ou Kopi-O Siew Dai, est un type de café de Singapour que j'apprécie. Il s'agit essentiellement d'une tasse de café avec un peu de sucre. Cette série est destinée à bloguer sur les connaissances techniques que j'ai acquises en buvant une petite tasse de Kopi-O Siew Dai.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!