Aracılığıyla paylaş


TryParse ve BindAsync yöntemleri doğrulandı

ASP.NET Core artık yöntemler için Map* parametre türlerinde ve BindAsync yöntemlerini doğrularTryParse. Geçerli bir yöntem bulunamazsa, ASP.NET Core geçersiz yöntemleri arar ve bulunursa başlangıçta bir özel durum oluşturur. Özel durum, yöntem imzanızın yanlış olabileceği konusunda sizi uyararak beklenmeyen davranışları önlemeye yardımcı olur.

Sürüm kullanıma sunulmuştur

ASP.NET Core 6.0 RC 2

Önceki davranış

ASP.NET Core 6'nın önceki sürümlerinde, bir TryParse veya BindAsync yöntemi geçersiz imzaya sahipse özel durum oluşturmamış ve çerçeve JSON'ı gövdeden bağlamayı denemiştir.

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

Yeni davranış

ASP.NET Core beklenen söz dizimine uymayan bir genel TryParse veya BindAsync yöntem bulursa, başlangıçta bir özel durum oluşturulur. Önceki örnek şuna benzer bir hata oluşturur:

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)

Hataya neden olan değişikliğin türü

Bu değişiklik ikili uyumluluğu ve kaynak uyumluluğunu etkileyebilir.

Değişiklik nedeni

Bu değişiklik, geliştiricilerin ve geçersiz biçime sahip yöntemlerin BindAsyncTryParse farkında olması için yapılmıştır. Daha önce, çerçeve parametresinin gövdeden JSON olduğunu varsaymaya geri dönecekti. Bu varsayım beklenmeyen davranışlara neden olabilir.

Türünüzün parametre bağlaması dışında bir nedenle farklı söz dizimine sahip BindAsync bir veya TryParse yöntemi varsa, şimdi başlangıçta bir özel durumla karşılaşırsınız. Bu davranışı önlemek için birden çok strateji kullanılabilir:

  • veya yönteminizi BindAsync veya TryParseprivateolarak internal değiştirin.
  • Çerçevenin aradığı söz dizimine sahip yeni BindAsync veya TryParse yöntem ekleyin; geçerli bir yöntem bulunursa geçersiz yöntemler yoksayılır.
  • Parametrenizi olarak [FromBody]işaretleyin.

Etkilenen API’ler

  • RequestDelegateFactory.Create()
  • Tüm IEndpointRouteBuilder.Map*() yöntemler, örneğin app.MapGet() ve app.MapPost()