Condividi tramite


I metodi TryParse e BindAsync vengono convalidati

ASP.NET Core ora convalida e i metodi TryParse e BindAsync sui tipi di parametro per i metodi Map*. Se non viene trovato alcun metodo valido, ASP.NET Core ricerca metodi non validi e genera un'eccezione all'avvio se ne viene trovato uno. L'eccezione consente di evitare comportamenti imprevisti avvisando che la firma del metodo potrebbe non essere corretta.

Versione introdotta

ASP.NET Core 6.0 RC 2

Comportamento precedente

Nelle versioni precedenti di ASP.NET Core 6, se un metodo TryParse o BindAsync aveva una firma non valida, non veniva generata alcuna eccezione e il framework tentava di associare JSON dal corpo.

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

Nuovo comportamento

Se ASP.NET Core trova un metodo TryParse o BindAsync pubblico che non corrisponde alla sintassi prevista, viene generata un'eccezione all'avvio. L'esempio precedente genera un errore simile al seguente:

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)

Tipo di modifica che causa un'interruzione

Questa modifica può influire sulla compatibilità binaria e sulla compatibilità dell'origine.

Motivo della modifica

Questa modifica è stata apportata in modo che gli sviluppatori siano consapevoli dei metodi BindAsync e TryParse che hanno un formato non valido. In precedenza, il framework eseguiva il fallback presupponendo che il parametro sia JSON dal corpo. Tale presupposto può comportare un comportamento imprevisto.

Se il tipo ha un metodo BindAsync o TryParse con una sintassi diversa per un motivo diverso dall’associazione di parametri, verrà ora rilevata un'eccezione all'avvio. Per evitare tale comportamento, sono disponibili più strategie:

  • Modificare il metodo BindAsync o TryParse in modo che sia internal o private.
  • Aggiungere un nuovo metodo BindAsync o TryParse con la sintassi cercata dal framework. I metodi non validi vengono ignorati se ne viene trovato uno valido.
  • Contrassegnare il parametro come [FromBody].

API interessate

  • RequestDelegateFactory.Create()
  • Tutti i metodi IEndpointRouteBuilder.Map*(), ad esempio app.MapGet() e app.MapPost()