TryParse- und BindAsync-Methoden werden überprüft.

ASP.NET Core validiert jetzt TryParse- und BindAsync-Methoden auf Parametertypen für Map*-Methoden. Wenn keine gültige Methode gefunden wird, sucht ASP.NET Core nach ungültigen Methoden und löst beim Start eine Ausnahme aus, wenn eine gefunden wird. Die Ausnahme hilft, unerwartetes Verhalten zu vermeiden, indem Sie benachrichtigt werden, dass Ihre Methodensignatur möglicherweise falsch ist.

Eingeführt in Version

ASP.NET Core 6.0 RC 2

Vorheriges Verhalten

In früheren Versionen von ASP.NET Core 6 wurde keine Ausnahme ausgelöst, wenn die Methode TryParse oder BindAsync eine ungültige Signatur hatte und das Framework versuchte, JSON-Code aus dem Text zu binden.

// Todo.TryParse is not in a valid format.
// Will try to bind from body as JSON instead.
app.MapPost("/endpoint", (Todo todo) => todo.Item);

public class Todo
{
    public string Item { get; set; }
    public static bool TryParse(string value) => true;
}

Neues Verhalten

Wenn ASP.NET Core eine öffentliche TryParse oder BindAsync Methode findet, die nicht der erwarteten Syntax entspricht, wird beim Start eine Ausnahme ausgelöst. Im vorherigen Beispiel wird ein Fehler ähnlich dem folgenden erzeugt:

TryParse method found on Todo with incorrect format. Must be a static method with format
bool TryParse(string, IFormatProvider, out Todo)
bool TryParse(string, out Todo)
but found
Boolean TryParse(System.String)

Typ des Breaking Changes

Diese Änderung kann sich auf die binäre Kompatibilität und Quellkompatibilität auswirken.

Grund für die Änderung

Diese Änderung wurde vorgenommen, damit die Entwickler auf BindAsync- und TryParse-Methoden aufmerksam gemacht werden, die ein ungültiges Format haben. Zuvor wurde für das Framework ein Fallback auf die Annahme verwendet, dass der Parameter JSON aus dem Text stammt. Diese Annahme kann zu unerwartetem Verhalten führen.

Wenn Ihr Typ eine BindAsync- oder TryParse-Methode mit einer anderen Syntax aus einem anderen Grund als der Parameterbindung hat, werden Sie jetzt beim Start eine Ausnahme feststellen. Um dieses Verhalten zu vermeiden, stehen mehrere Strategien zur Verfügung:

  • Ändern Sie Ihre BindAsync- oder TryParse-Methode in internal oder private.
  • Fügen Sie eine neue BindAsync- oder TryParse-Methode mit der Syntax hinzu, nach der das Framework sucht. Ungültige Methoden werden ignoriert, wenn eine gültige gefunden wird.
  • Markieren Sie Ihren Parameter als [FromBody].

Betroffene APIs

  • RequestDelegateFactory.Create()
  • Alle IEndpointRouteBuilder.Map*()-Methoden, zum Beispiel app.MapGet() und app.MapPost()