.NET URI ve Nokta Bug' ı

Etiketler .net, bug, development, yazilim, 19.11.2007

Burada kesinlikle ilginç ve saçma bir şeyler var aşağıda ki kodu inceleyiniz :

Dim WTF As New Uri("http://www.example.com/test.?noktanerede")
Console.WriteLine(WTF.AbsoluteUri)

Kodun şu çıktıyı vermesini bekliyoruz :

http://www.example.com/test.?noktanerede

Ancak nedense .NET oradaki sondaki noktanın gereksiz olduğuna inanıp onu siliyor ve karşımıa şu çıkıyor:

http://www.example.com/test?noktanerede

Bu gerçek bir sistemde başıma geldi ve nokta kaybolduğundan dolayı 404 alıyorum, bu bilinen bir bug mı? Yoksa başka ilginç bir şey mi var?

Araştırmacı gazeteciliğimizi konuşturup ekibimiz sonuçlara ulaştı:

Neden noktalar kayboluyor?

Noktalar kayboluyor çünkü RFC3986 , 5.2.4 dermiş ki path' lerde noktalar silinecek. Tabii o böyle demiyor ama ben size özet geçiyorum.

Microsoft' ta demişki hayatımızda bir işi düzgün yapalım, RFC' ye uyalım. Dolayısıyla normal şartlar altında URI class' ı path kısmında nokta kabul etmiyor.

Bu Sorunu Nasıl Çözeceğiz?

Sorunu çözmek için bir denem yapmıştım ama çalışmadı. İlk başta çalıştığını düşündüm çünkü ancak testlerimde nokta yokken benzer başka bir cevap alıyormuşum. Dolayısıyla çalışmamış.

Ana sorun URI class' ının üzerine yazmamız gereken AbsoluteUri property' si overridable değil. Dolayısıyla bir şekilde bunu zorla yapmak gerekiyor. Aklıma reflection ya da ana System.dll i modifiye edip tekrar compile etmek geldi ama iki çözüm de çok kötü, uzun ve sağlıksız.

Dolayısıyla ben hala bir çözüm bulamadım, heyecanla sizin çözümlerinizi bekliyorum.

Necmettin - 27.11.2007

Yorumlardan birinde (http://ferruh.mavituna.com/comment/.?comment=78819) sinan arkadasimizin yaptigi hata su: /abc/def/. = /abc/def/

Hem Windows'da hem de Linux'da her dizinde gizli bir . ögesi bulunur ve dizinin kendisini isaret eder. ali dizinindeyken cd . derseniz ali dizininde kalirsiniz.

Asil makaledeki probleme gelirsek:
Windows'da uzantisi olmayan dosya ve dizinlerde . kullanilmaz (di, iki yildir Windows kullanmiyorum, artik farkli olabilir):
touch ahmet = touch ahmet. (mantiken)
Dolayisiyla siz test. yazdiginizda, ulasmak istediginiz yer, test adli dosya olur.
Sanirim problem bu.

Ferruh Mavituna - 19.11.2007

Yukariya cozum kodunu yapistirdim, megersem AbsoluteUri degilde ToString' imis esas eleman.

Ferruh Mavituna - 19.11.2007

Simdi internette buldum bu RFC ye gore boyleymis hakikaten :
http://www.ietf.org/rfc/rfc3986
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=179248
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1082198&SiteID=1

Noktalari silme bolumunde. Ancak komik olan kimse cozumu bilmiyor. Neyse bulursam onu da gonderirim.

Ferruh Mavituna - 19.11.2007

Aslinda simdi aklima geldi noktayi %2e olarak gonderirsem server soprun cozulebilir ama URI de o kadar salak ki alir onu otomatik olarak decode eder, beni de deli eder:)


:) Denedim hakikaten de onu otomatik decode etti ve sonra da sildi. "Don't Encode" ta artik calismadigindan sanirim o sekilde direk girdi yapmak direk URI den mumkun gozukmuyor.

Ferruh Mavituna - 19.11.2007

Aslinda simdi aklima geldi noktayi %2e olarak gonderirsem server soprun cozulebilir ama URI de o kadar salak ki alir onu otomatik olarak decode eder, beni de deli eder:)

Ferruh Mavituna - 19.11.2007

bu durum .net uri den degil http protokolünden sanirim, çünkü http://ferruh.mavituna.com/.?ex=666&pg=141 gibi adresini herhangi bir browser ile açmaya çalistiginda http://ferruh.mavituna.com/?ex=666&pg=141 adresine gidiyor...


Sonucta sen browser a o noktayi koydugunda browser onu aynen gonderiyor yani nokta yi silmiyor. Dolayisiyla eger server bu noktayi kullanmak isterse kullanabilir. Ancak .NET te bu nokta hic bir zaman servera ulasmiyor dolayisiyla noktayi bekleyen server direk olarak calismamaya basliyor. Muhtemelen RFC ye gore zaten orada nokhta olmamasi gerekiyor ancak gel gorki bazi sistemler bu sekilde ilginc isimleri URL Rewrite ile kullaniyorlar.

bence url yapisini degistirmek en mantiklisi ama eger bu imkan yoksa replace vs.. ile çözülebilr.

Maalesef replace ile cozulemiyor cunku AbsoluteUri readonly property ama belki inherit edip override edilerek cozulebilir. Onu henuz denemedim.

sinan - 19.11.2007

bu durum .net uri den degil http protokolünden sanirim, çünkü http://ferruh.mavituna.com/.?ex=666&pg=141 gibi adresini herhangi bir browser ile açmaya çalistiginda http://ferruh.mavituna.com/?ex=666&pg=141 adresine gidiyor...
bence url yapisini degistirmek en mantiklisi ama eger bu imkan yoksa replace vs.. ile çözülebilr.

Yorum Yazın


Tüm yorumlar onaydan geçmektedir, bu işlem en uzun 30 dk. sürecektir. E-mail adresleri yeni yorumları bildirme harici hiç bir başka amaçla kullanılmamaktadır ve sitede gözükmemektedir.



Captcha Kodu