MTmertturkoglu.comTüm yazılar

Microsoft ·

.NET MAUI'de ?weight=62.5 neden bir dosya uzantısı sanılıyordu?

dotnet/maui #29560: BlazorWebView, sorgu parametresinde nokta olan sayfaları yeniden yükleyemiyordu. Kök neden tek satırdı; PR'ın birleşmesi bir yılı aştı.

#25689 numaralı issue'da bildirilen hata şuydu: .NET MAUI'nin BlazorWebView bileşeninde, sorgu parametresinde nokta bulunan bir adres (örneğin ?weight=62.5) zorla yeniden yüklenemiyordu.

Kök neden

Bir adresin sayfa mı yoksa dosya mı olduğuna karar veren IsBaseOfPage, kontrolü adresin tamamı üzerinde yapıyordu:

if (Path.HasExtension(uriString))
{
	// If the path ends in a file extension, it's not referring to a page.
	return false;
}

Path.HasExtension bir URL'yi tanımaz; ona göre .../sayfa?weight=62.5 adresinin sonu .5 uzantısıyla biten bir dosyadır. Bu yüzden sayfa, dosya isteği gibi işleniyor ve yeniden yükleme engelleniyordu.

Düzeltme

Uzantı kontrolü artık sadece adresin yol (path) bileşenine bakıyor. Bunun için adres önce güvenli şekilde ayrıştırılıyor; boş, göreli ya da bozuk girdiler reddediliyor. Şema ve host eşleştirmesi eskisi gibi Uri.IsBaseOf ile yapılıyor:

internal static bool IsBaseOfPage(this Uri baseUri, string? uriString)
{
	if (string.IsNullOrWhiteSpace(uriString))
	{
		return false;
	}

	if (!Uri.TryCreate(uriString, UriKind.Absolute, out var uri))
	{
		return false;
	}

	if (Path.HasExtension(uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)))
	{
		return false;
	}

	return baseUri.IsBaseOf(uri);
}

Uzun inceleme

PR'ı Mayıs 2025'te açtım, Haziran 2026'da birleşti. Bu sürede birkaç tur inceleme yapıldı. Bir ara düzeltmeyi hatanın kapsamının ötesine genişletmiştim; inceleme sonrası orijinal Uri.IsBaseOf davranışına geri döndüm. İncelemede yakalanan en önemli nokta testlerle ilgiliydi: yeni birim test projesi çözüm dosyalarına eklenmişti ama CI'ın çalıştırdığı test listelerinde yoktu. Yani regresyon testleri derleniyor ama hiç çalışmıyordu. Projeyi CI'ın test listelerine de ekledim.

Düzeltme .NET 10 ile yayınlandı. Satır sayısı küçük bir değişiklik; asıl iş, testlerin gerçekten çalıştığından emin olmaktı.