Skip to content

Bir değişik Asenkron Response Örneği

2 hafta kadardır blog işlerini oldukça salladım farkındayım, ancak bu sürede yazılabilecek bir tomar şey birikti, ara ara bu hafta hepsini eklemek düşüncesindeyim. 20 gün kadar önce bir asenkron veri sağlama sistemi hayata geçirmek zorunda kaldım ki, deneyimlerimi paylaşmak isterim.

Sistemde bir A sitesi var sistemin çalıştığı ve bir de B sitesi var verinin sağlandığı. B sitesinden alınacak veri salt bir html veri, herhangi bir standarta uymuyor ya da web service değil. A sitesine giren bir kişinin verdiği bilgiler ışığında B ye post edilen verilerden dönen response incelenip duruma göre bir redirect durumu söz konusu. Ana kıstas B nin response zamanlarının çok değişken oluşu. Bazen 1 sn ye de cevap verirken bazen süre 30 sn yeyi bulabiliyor. Eğer bir bekletme düşünüyorsanız sürenin timeout süreleri (standart olarak 90 sndir) dısında olduğundan mantıklı bir bekleme süresi oldugunu dusunebilirsiniz ama benim kanaatim bu beklemenin timeout süreleri ile ilgili degil A sitesinde response bekleyen kullanıcının sabrı ile ilgilidir. 30 saniye gelmeyen bir sayfaya bakmak her Türk’ün yapabileceği bir şey değil kanımca, beklemeyen kullanıcı refresh yaptıkca hem B ye olan yüklenme artmakta hemde A daki sistemin B den cevap bekleyen threadları artmakla birlikte aynı zamanda gereksiz bir yüklenme ile karşılaşacaktır. (Bunuda önlemek mümkün en sonda yazdım)

Kendimce bulduğum çözüm şöyle, asenkronize olacak çalıştığı için A ve B, A da B den cevap beklenene kadar bitmeyen ama bufferlanmayan bir içerik ile kullanıcıyı bir şey yapıldığı izlenimi yaratmak. Tıpkı mesela XP kurulumunda altta sırayla yanan iconlar gibi. makina durdumu kilitlendimi acaba diye bakınca altta hareket eden bu objeleri görünce beklemek gerektiğini düşünüyor ve müdahale etmiyoruz.

Öncelikle çıkışı boşaltıp sonra bufferlamayı kapatmamız lazım bunun için

Response.Clear
Response.Buffer = False
Response.BufferOutput = False

Sonra içeriğinde kullanıcıyı oyalayacak içerik bulunan redirect.htm dosyasınını çıkışa yazıyoruz.

Response.TransmitFile(Server.MapPath("~/redirect.htm"))
Response.Flush()

Bu arada kullanıcı bu oyalama sayfasını görüntülerken işlemleri yapalım, son olarak işlem sonucuna göre sayfayı gereken yere yönlendirelim.

Response.Write("<script type=""text/javascript"">window.location.href=""form.aspx""</script>")
Response.Flush()
Response.End()

Hepsi bu kadar. Kullanıcı tarafında javascript gerekli yönlendirme yapabilmek için tabi, %99.9 javascript destekli browser kullanıyoruz ancak tedbirli olmak isterseniz oyalama sayfasına “30 saniye içerisinde bir cevap alamazsanız buraya tıklayınız” şeklinde manual bir cevrim de olasılığı da sunabilirsiniz tabi. Ancak hem bu manual linke hem de sayfa yenilemelerine önlem olarak multithread olarak yapılan B sayfası işlemlerinin session içinde thread la ilgili veriler tutulması ile birlikte henüz thread ından cevap gelmeyen kullanıcılar için yeniden işlemi başlatmamak için bir rutinde araya sıkıştırılabilir. Olabildiğince salt olarak anlatmaya çalıştım o yüzden bu son yazdıklarım kodlarda yok.

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*