Heim > Artikel > Backend-Entwicklung > [KOSD] Änderung der FromQuery-Modellbindung von .NET auf .NET8
Vor Kurzem hat mein Teamkollege Jeremy Chan bei der Migration unseres Projekts von .NET 6 auf .NET 8 eine undokumentierte Änderung im Modellbindungsverhalten entdeckt, die seit .NET 7 aufzutreten scheint. Diese Änderung wird im offiziellen .NET nicht klar erklärt Dokumentation, daher kann es etwas sein, was Entwickler leicht übersehen.
Um das Problem zu veranschaulichen, beginnen wir mit einem einfachen Web-API-Projekt und erkunden eine einfache Controller-Methode, die die Änderung hervorhebt.
[ApiController] public class FooController { [HttpGet()] public async void Get([FromQuery] string value = "Hello") { Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; } }
Dann gehen wir davon aus, dass wir Nullable sowohl in .NET 6- als auch in .NET 8-Projekten aktiviert haben.
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <Nullable>enable</Nullable> ... </PropertyGroup> ... </Project>
Wenn wir in .NET 6 den Endpunkt mit /foo?value= aufrufen, erhalten wir die folgende Fehlermeldung.
{ "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." ] } }
Wenn wir die Methode jedoch wie folgt ändern, tritt der Fehler nicht auf.
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 }; }
Das Protokoll beim Aufruf des Endpunkts mit /foo?value= lautet dann „Wert ist null!!!“.
Daher können wir wissen, dass eine Abfragezeichenfolge ohne Wert als null interpretiert wird. Aus diesem Grund tritt ein Validierungsfehler auf, wenn der Wert nicht nullbar ist.
Daher können wir sagen, dass wir den Endpunkt wie folgt ändern müssen, damit der Endpunkt in .NET 6 funktioniert, um den Wert optional zu machen. Dadurch wird der Wert nicht als Pflichtfeld markiert.
public async void Get([FromQuery] string? value = "Hello")
Wenn wir nun den Endpunkt mit /foo?value= aufrufen, wird das Protokoll „Value is Hello“ gedruckt.
Wie wäre es dann mit .NET 8 mit dem gleichen Original-Setup, also wie unten gezeigt.
public async void Get([FromQuery] string value = "Hello")
Wenn wir in .NET 8 den Endpunkt mit /foo?value= aufrufen, wird das Protokoll „Value is Hello“ gedruckt.
Also, was passiert hier?
In .NET 7 wurde eine neue Schnittstelle IParsable eingeführt. Daher wird ab .NET 7 die IParsable.TryParse-API zum Binden von Controller-Aktionsparameterwerten verwendet.
Erste Untersuchungen zeigen, dass ab .NET 7 unter der Haube die neue Modellbindungsimplementierung verwendet wird und dies dazu führt.
KOSD oder Kopi-O Siew Dai ist eine Sorte Singapur-Kaffee, die ich mag. Es ist im Grunde eine Tasse Kaffee mit etwas Zucker. Diese Serie soll über technisches Wissen bloggen, das ich bei einer kleinen Tasse Kopi-O Siew Dai gewonnen habe.
Das obige ist der detaillierte Inhalt von[KOSD] Änderung der FromQuery-Modellbindung von .NET auf .NET8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!