Javascript ile sunucuya dosya yükleme işlemi

13 Eki

Javascript dili son yıllarda yaygın bir ön yüz(front end) geliştirme aracı haline gelmiştir. Farklı problemlere çözüm üreten kütüphanelerin sayısı gün geçtikçe artmakta ve “front end” geliştiricilerin işi de epeyce kolaylaşmaktadır.  Bazı durumlarda hazır kütüphanelerin dışına çıkıp kontrolü elimize almak istediğimizde Javascript kodları ile birebir haşır neşir olmak durumunda kalırız.

Javascript ile ağırlıklı olarak DOM (Document Object Model) işlemeleri yapılmaktadır. DOM Türkçe olarak “Belge Nesnesi Modeli” şeklinde çevirilebilir. Sunucu tarafından oluşturulup(render) bize gönderilen internet sayfasını bir belge olarak düşünebiliriz. Bu internet sayfasında gördüğümüz yazı, resim, video, form gibi elemanları birer nesne olarak düşünebiliriz. Javascript dili ile bu nesneler üzerinde işlemler yapabilmekteyiz. Bunun yanı sıra Javascript dili bize sunucu ile iletişim kurmamızı da sağlamaktadır. Sunucudaki bir URL üzerinden veri istemek veya sunucuya veri göndermek mümkündür.

Javascript bize, sunucuya düz metin (plain text) verisi göndermenin yanı sıra bir de dosya gönderme imkanı sunmaktadır. Bu yazının konusu da dosyaların sunucuya gönderimi sırasında işlemleri takip etmektir.

Javascript ile arka plandan sunucu ile bilgi alışverişi yapmak istediğimizde XMLHttpRequest nesnesini kullanırız. XMLHttpRequest nesnesi ile;

  • Sayfa yenilemeden bilgi alışverişi yapmak mümkündür.
  • Veri alışverişi arka planda gerçekleşir.
  • Veri alışverişi asenkron veya senkron olarak belirlenebilir.

Sunucuya bir istek göndermek için XMLHttpRequest nesnesinin Open() ve Send() metodları kullanılır.

  • open() Metodu: Gönderilen isteğin(request) türünü(GET, POST), URL adresini ve isteğin asenkron olup olmadığını belirler.
  • send() Metodu: İsteği sunucuya gönderir.

XMLHttpRequest nesnesinin çalışma prensibini incelemek için bir kaç örnek vermeden geçmek olmaz.

Örnek: Senkron çalışan yöntem

Senkron Yöntem
Senkron Yöntem

Senkron yöntemlerde open() metodunun son parametresi false olarak belirlenir ve send() metodu ile istek sunucuya gönderilir. İşlem asenkron olmadığından istek gönderildikten sonra cevap gelene kadar beklenir. Yani send() metodundan sonra gelen kodlar çalışmaz.

Örnek: Asenkron çalışan yöntem

Asenkron Yöntem
Asenkron Yöntem

Asnekron isteklerde open() medodunun son parametresi true olarak belirlenir ve request nesnesinin readystatechange olayına(event) bir metod bağlanır. Sunucudan cevap geldiğinde bu metod tetiklenir. İsteği göndermek için send() metodu çalıştırılır.  İşlem asenkron olduğundan send() metodu çalıştırıldıktan sonra başka kod satırları varsa onlar da çalıştırılır.

Bu örneklerde sunucudan GET metodu ile düz metin sonucu almak için uygulamalar yaptık.

Asıl konumuz, bir dosyanın bir isteğe(request) eklenerek sunucuya gönderilmesi işlemidir. Dosyalar büyük veriler olabildiği için, uzak sunucuya gönderilmeleri sırasında takip grektiren bir durum durum ortaya çıkmaktadır. İsteğin sunucuya ulaşıp ulaşmadığı, dosyanın bir T anında yüzde kaçının yüklendiği ve işlemin tamamlanıp tamamlanmadığı gibi durumların kullanıcıya bildirilerek belirsizliğin ortadan kaldırılması gerekmektedir.

Dosya gönderim işlemleri sırasında XMLHttpRequest nesnesinin upload özelliğinden faydalanırız. upload özelliği üzerindeki olaylar(events) sayesinde yükleme işlemlerini takip edebiliriz.

Upload Javascript Kodu
Upload Javascript Kodu

upload özelliğinin;

  • loadstart olayı: yükleme işlemi başladığında tetiklenir.
  • progress olayı: yükleme işlemi sırasında her giden byte grubu sunucuya aktarıldığında tetiklenir.
  • load olayı: yükleme işlemi başarıyla tamamlandığında tetiklenir.

request.open() metodu çalıştırıldıktan sonra setRequestHeader metodu ile gönderilecek olan isteğe(request) dosya bilgileri eklenir. Dosya bilgileri, file tipindeki input elementinden alınır. send() metodu ile istek POST tipinde sunucuya gönderilir. Burada send netodunun parametre alan çeşidi kullanılmış ve parametre olarak POST edilecek bilgi send metoduna eklenmiştir.

Dosya Upload İşlemi
Dosya Upload İşlemi

Dosya yükleme sırasında işlem takibini konsola yazarak gerçekleştirdim. Siz isterseniz HTML elementlerine yazarak gerçekleştirebilirsiniz. Hatta daha önceki yazılarımdan birinde css aracılığı ile durum çubuğu yapmayı işlemiştim. Dosya upload işlemini bu yöntemle bir durum çubuğuna bağlamak mümkündür.

Bir sonraki yazıda görüşmek üzere.

ArcGIS Map Server verileri ile Google Chart çizdirilmesi

22 Tem

Bir önceki yazıda ASP.NET Web API ile  tarafından servis edilen JSON verileri ile Google grafiklerinin çizimini yapmıştık. Bu yazıda da yine Google grafik çizimi üzerinde duracağız. Grafik çizimi için kullanacağımız veri ise uzak bir sunucu üzerinde elde edilecek. Uzak sunucu verileri ise ArcGIS firmasının sunmuş olduğu örnek REST servislerinden elde edilecek.

ArcGIS firmasının sunduğu örnek servislere buradan ulaşmak mümkündür. Biz bu servislerden nüfus ile alakalı olan demografik yapı servislerini kullanacağız. Demografik yapıya ait şu anda üç farklı MapServer hizmeti açılmış durumda. Biz bunlardan Demographics/ESRI_Census_USA servisi tarafından sunulan verilerle çalışacağız. USA’de bölgeler ya da eyaletler(states) adı altında sunulan Feature Layer üzerinden bir istatistik alarak örnek bir grafik çizdirmeye çalışalım. Bu örnek istatistiğimiz “2007 yılında nüfusu 9 milyondan büyük olan bölgelerin listesi.” şeklinde olsun.

Örnek uygulamamız, sunucu üzerinde çalışan tek bir HTML dosyası da olabilir, bir ASP.NET uygulaması üzerinden de çalışabiliriz. Yapacağımız şey ArcGIS Server sunucusuna bir sorgu gönderip gelen veriyi işlemek.

Feature Layer Servisi: http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5

Bu servise bir sorgu gönderdiğimizde gelen verinin JSON şekli aşağıdaki gibidir.

Arcgis Query Result
Arcgis Query Result

Bize grafik çizimi için gerekli olan kısım, kırmızı çerçeve içerisine alınmış features dizisidir. Bu dizi içerisinde her bir attribute, nüfus(POP2007) ve bölge adı(STATE_NAME) bilgileri bulunmaktadır. Bu bilgiler ışığında sorgulama ve çizim işlemlerini javascript ortamında aşağıdaki gibi gerçekleştirebiliriz.

<script type='text/javascript' src='https://www.google.com/jsapi'></script>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script>
<script type="text/javascript">

function getMap() {

   var mapserverUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5/query";
   var parameters = { f: "json", where: "POP2007 > 9000000", returnGeometry: false, outFields: "POP2007,STATE_NAME" };

   $.ajax({
          url: mapserverUrl,
          data: parameters,
          dataType: "jsonp",
          jsonpCallback: "callback",
          success: function (response) {
             createGraphics(response.features);
          }
   });
 }

function createGraphics(data) {

    var table = new google.visualization.DataTable();
    table.addColumn('string', 'STATE');
    table.addColumn('number', '2007 POP');

    for (var i = 0; i < data.length; i++)
        table.addRow([data[i].attributes.STATE_NAME, data[i].attributes.POP2007]);

    var options = { title: 'Population of 2007 in the USA, Bigger than 9 Million' };
    var chart = new google.visualization.ColumnChart(document.getElementById('cbs'));
    chart.draw(table, options);
 }

 google.load("visualization", "1", { packages: ["corechart"] });
 google.setOnLoadCallback(getMap);

</script>

Yaptığımız sorgu standart bir ajax sorgusudur. parameters olarak belirlenen veri kümesi servis URL’i için queryString verilerini barındırmaktadır. Gerisi zaten Google grafik API işlemleri Bu örnek uygulamanın çıktısı aşağıdaki şekilde olacaktır.

Arcgis ve Google Chart
Arcgis ve Google Chart

Asp.Net XMLHttpRequest ve Proxy Uygulaması

20 Haz

Bir önceki yazımızda XMLHttpRequest nedir, nasıl kullanılır ve kullanılırken ne gibi sorunlar ile karşılaşılır şeklinde bir incelemede bulunmuştuk.

Bu yazıda ise ASP.NET MVC tabanlı bir uygulamada javascript ile XMLHttpRequest göndermeyi ve karşılaşılan sorunları inceleyeceğiz.

Bir önceki yazımızda, bir XMLHttpRequest gönderme işleminin uygulama sunucusuna yapılması durumunda bir sorunla karşılaşmayacağımızdan ancak dışarıdaki bir sunucuya istek gönderirken bir yetki sorunuyla karşılaşacağımızdan bahsetmiştik.

Şimdi ASP.NET MVC uygulamasında bulunan bir controller sınıfındaki JsonResult döndüren bir action metoduna XMLHttpRequest göndermeye çalışalım.

public class HomeController : Controller
{
     public JsonResult Application()
     {
         var jsonResult = new {
                                Name = "XMLHttpRequest Applcaition",
                                Date = DateTime.Now.AddDays(-5).ToShortDateString()
                              };

        return Json(jsonResult, JsonRequestBehavior.AllowGet);
      }
}

Basit bir JSON nesnesi döndüren bir metod olşuturduk. Şimdi View tarafından bu metoda bir XMLHttpRequest gönderelim. Yani kendi uygulamamızı sunan sunucuya bir XMLHttpRequest gönderelim ve internet tarayıcımızın tavrına bakalım.

Uygulama Sunucusuna Gönderilen XMLHttpRequest
Uygulama Sunucusuna Gönderilen XMLHttpRequest

İnternet tarayıcımız hiç itiraz etmeden sorguyu Javascript aracılığı ile başarılı bir şekilde almıştır.

Şimdi de uygulama sunucumuzun dışındaki bir sunucuya istek(request) göndermeye çalışalım ve sonucu görelim.

Farklı Sunucuya XMLHttpRequest gönderilmesi
Farklı Sunucuya XMLHttpRequest gönderilmesi

Tarayıcımız kodu derlerken bize bir itirazda bulundu. Hata “Erişim Engellendi” şeklinde. İnternet tarayıcımız bize uygulama sunucumuz dışına çapraz(cross) sorgu gönderme izni vermiyor ve ağ iletişimini kapatıyor.

Bu sorunu aşmak için uygulama sunucumuza bir istek gönderip, uygulama sunucumuz üzerinden ilgili sorgunun sonucunu almaya çalışacağız. Yani arka kapıdan dolaşmak zorunda kaldık.

Şimdi projemize bir Proxy uygulaması oluşturup bu uygulama üzerinde işlemi deneyelim. Projemize Proxy adında bir dizin açıp içerisine Proxy.ashx adında bir Generic Handler ekleyelim.

public class proxy : IHttpHandler
{
     public void ProcessRequest(HttpContext context)
     {
         context.Response.ContentType = "text/plain";

         WebRequest request = WebRequest.Create("http://www.google.com");
         WebResponse webResponse = request.GetResponse();

         Stream responseStream = webResponse.GetResponseStream();

         if (responseStream != null)
         {
              StreamReader reader = new StreamReader(responseStream);

              context.Response.Write(reader.ReadToEnd());
         }
     }

     public bool IsReusable
     {
        get
        {
             return false;
        }
     }

}

Javascript üzerinden bu proxy’ye XMLHttpRequest göndereceğiz ve proxy’nin elde ettiği sonucu kullanacağız.

Proxy ile XMLHttpRequest
Proxy ile XMLHttpRequest

Olay bu kadar basit aslında. Bu şekilde istediğimiz sosyal paylaşım sitelerine, değişik hizmetler sunan web servislerine Javascript üzerinden erişebiliriz.

Bu yöntem, CBS tarzı harita uygulamalarında farklı yerlerde barınan sunuculara Javascript API’ler üzerinden sorgu gönderirken çok işe yarıyor. Örneğin Map servislerini bir sunucudan, Harita resimlerini başka bir sunucudan, kişi bilgilerini ayrı bir servis üzerinden çekip tek bir sunum ortamında faydalanmak mümkün hale gelebiliyor. Farklı çözümlerde bu yöntemi kullanmak size kalmış.

Bir sonraki yazıda görüşmek dileğiyle.

Javascript Nesne Kavramı

11 Haz

Javascript dünyası her ne kadar client taraflı uygulamalar için geliştirilmiş bir dil olsa da kullanıcılara nesnelerin tanımlanabildiği ve kullanılabildiği bir ortam sunmaktadır. Javscript içerisinde tanımlı kendine ait bazı nesneleri şu şeklide sıralayabiliriz. String, Date, Math, JSON v.b. Bu nesnelerin yanında kendimiz de nesneler tanımlayıp kullanabiliriz.

Javascript Nesne Oluşturulması

Javascript, standart olarak Object adında bir nesne sunar. Oluşturulan nesneler de Object türündedir. Örneğin bir nesnenin oluşturulmasını şu şekilde yapabiliriz.

       var bankAccount = new Object();

Bu şekilde herhangi bir üyesi bulunmayan ve sadece “Object” tipine ait üyeleri barındıran bir bankAccount nesnesi oluşturmuş olduk. Bu nesneyi daha basit bir şekilde aşağıdaki gibi tanımlayabiliriz.

       var bankAccount = {};

Yani Object anahtar kelimesini kullanmadan da tanımlama yapmak mümkündür.

Nesnelere Property eklenmesi

Oluşturduğumuz nesnelere property eklenmesi işlemini aşağıdaki şeklide gerçekleştirebiliriz.

       var bankAccount = {};
       bankAccount.number = 114521;

nesnelere bir değer veya fonksiyonu property olarak belirleyebiliriz. Bir property eğer bir fonksiyonu işaret ediyorsa ona metod diyebiliriz.

       var bankAccount = {};
           bankAccount.number = 114521;
           bankAccount.owner = "Bayram Üçüncü";
           bankAccount.balance = 500;
           bankAccount.details = function () {
             return "Account: " + this.number +
                    " belongs to " + this.owner +
                    "\nBalance: " + this.balance;
      };

Yukarıda tanımladığımız bankAccount nesnesine ait “details” isimli property bir metoddur. Metodlar içerisinde kullanılan this anahtar kelimesi metodun ait olduğu nesneyi ifade eder. Bu sebeple yukaridaki “details” metodu içerisinden diğer üyelere this anahtar kelimesi ile ulaşabilmekteyiz. Metod içerisinden this anahtar kelimesini kullanmadan bir üyeye erişmeye çalışırsak hata ile karşılaşırız.

Nesne Üyelerinin Oluşturma Sırasında Eklenmesi

Nesneleri oluşturduktan sonra üyelerin belirlenmesi mümkün olduğu gibi, nesne oluşturulurken üyelerinin belirlenmesi de mümkündür. Kodun temiz olması açısından kullanılabilecek bir gösterim olarak değerlendirilebilir.

       var bankAccount = {
           number: 114521,
           owner: "Bayram Üçüncü",
           balance: 500,
           details: function () {
                    return "Account: " + this.number +
                           " belongs to " + this.owner +
                           "\nBalance: " + this.balance;
           }
       };

Constructor(kurucu metod) Kullanılması

Yukarıda tanımladığımız nesne oluşturma şeklini tekrar hatırlayalım. Basit haliyle bir nesnenin oluşturulması şu şekildeydi.

       var bankAccount = {};

Bu nesneye bir constructor eklemek istediğimizde ne yapmamız gereken şudur:

       var bankAccount = function (number, owner, balance){};

Bu fonksiyon “{}” parantezlerden hemen önce belirlenmiştir. Javascript ortamında construstor fonksiyonlar property’leri this isimli nesneye atarlar. Javascript ortamındaki constructor fonksiyonlar C# veya Java’daki sınıflara benzerler. Constructor kullanarak yeni bir nesne oluşturup o nesneye

       var BankAccount = function (number, owner, balance){
           this.number = number,
           this.owner = owner,
           this.balance = balance,
           this.details = function() {
             return "Account: " + this.number +
                    " belongs to " + this.owner +
                    "\nBalance: " + this.balance;
           };
        };

Oluşturduğumuz bu nesneyi şu şeklide kullanabiliriz.

       var myAccount = new BankAccount(914521, "Bayram Üçüncü", 500);

Constructor fonksiyonu tanımladıktan sonra nesne örneğinizi oluşturmak için “new” operatörünü kullanabilirsiniz. Oluşturduğunuz bu nesne örneğinin property’lerine ulaşabilirsiniz.

Nesnelerin Prototiplerinin Kullanılması

Javascript Object tipinde bulunan prototype adlı özel bir metod, tüm nesnelerde bulunur. Bu metod sayesinde nesnelere yeni property veya metodlar ekleyebilirsiniz. Constructor fonksiyonları ile kendi özel tiplerimizi oluşturmamız mümkündür. Oluşturduğumuz tipe ait iki farklı nesne örneği oluşturacağımız vakit her bir nesne örneği kendi property kümesini bünyesinde barındırır. Bu durum, veri tutucu property’ler için makul görünse de metodlar için bir sorun haline gelebilir. Metodlarımızı oluşturduğumuz tip içerisinden ayırabiliriz.

Örnek-1: Prototype kullanılmadan

       var Rectagle = function (x,y) {
           this.x = x;
           this.y = y;
           this.Area = function() { return x*y; };
      };

Örnek-2: Prototype kullanarak

       var Rectangle = function (x, y) {
           this.x = x;
           this.y = y;
       };

       Rectangle.prototype = {
           Area: function() { return (this.x * this.y); }
       };

Örnek-2 de alan hesaplayıcı metod olan Area metodu Örnek-2 de tipin prototype metoduna tanımlanmıştır.

Bu bize ne fayda sağlamıştır? Örnek-1 de constructor içinde tanımlanan fonksiyon için her Rectangle nesnesi oluşturulduğunda bellekte anonim bir fonksiyon oluşturulacak ve yer tutacak. Ancak Örnek-2 de durum farklı olacaktır. Prototype property’ler static olduklarından her Rectangle nesnesi prototype içine tanımlanan metodları referans olarak görecektir.

Ayrıca Rectange tipine ait değer tutucu (x,y) üyeler ve fonksiyonlar ayrılmış oldu. Bu ayrımı farklı Javascript dosyalarına bile dağıtmak mümkündür.

Prototype kullanımı öncelikli olarak performans artışı sağlamakla birlikte kodun okunabilirliğini de arttırmak açısından faydalı olmaktadır.

Bu yazımızda Javascript ile nesnelerin oluşturulmasını, constructor kavramını, nesnelere property eklenmesini ve Object tipinin bünyesindeki prototype kullanımını incelemiş olduk. Bir sonraki yazıda görüşmek üzere.

Javascript Kod Kapsamının Yapılandırılması

10 Haz

Web uygulamalarımız geliştikçe ve yazılan kod satırları arttıkça, kodun yönetimini kolaylaştırmak amacıyla kodun iyi yapılandırılmış olması önem kazanmaya başlar. Bu kural, yazılımcılar tarafından edinilen tecrübelerle ortaya konmuştur.

Bu yazımızda Javascript kodunun iyi yapılandırılmasıyla ilgili kurallardan bahsedeceğiz. Javascript ortamında değişkenler için kod kapsamını incelemeye çalışacağız.

Değişkenlerin Erişilebilirlik Alanları

Javascript, internet tarayıcılar tarafından yorumlanan bir dildir. Bu sebeple Client taraflı uygulamalar Javascript ile geliştirilebilir. Diğer popüler dillerden(C++, C#, Java v.b) bu yönüyle ayrılır. Kod yazım kuralları diğer programlama dillerine biraz benzerdir.

Javascript ortamında tanımlanan değişkenlere nereden ulaşılabileceğine geliştiriciler karar verir. Bir değişken, her yerden ulaşılacaksa global şekilde tanımlanabilir veya sadece bir fonksiyon içerisinde kullanılacaksa yerel bir şekilde de tanımlanabilir.

Yani iki yeni kuralımız ortaya çıkmış oldu.

  • Değişkenler bir fonksiyonun dışında tanımlanmışsa global olur.
  • Bir fonksiyon içerisinde tanımlanmışsa yerel olur ve o fonksiyon içinde her yerden(fonksiyon içindeki başka bir fonksiyondan bile) erişilebilir.

Örnek-1:

<script type="text/javascript">
     var name = "Bayram";

     function getUsername() {
          alert(name);
     }
</script>

Bu örnekte “name” değişkeni global olarak tanımlanmıştır. “name” değişkenine artık her yerden erişilebilir. Bu kodu bir *.js dosyasına tanımlayıp dosyayı gören her yerden “name” değişkenine erişebiliriz.

Örnek-2:

<script type="text/javascript">

    var name = "Bayram";

    function getUsername() {
       var name = "Undefined";
       alert(name);
    }
</script>

Bu örnekte tanımladığımız “getUsername” fonksiyonu çalıştırıldığında çıktı olarak “Undefined” şeklinde bir uyarı penceresi açılacaktır. “Bayram” diye uyarı vermeyecektir. getUsername fonksiyonu içinde yerel olarak tanımlanan “name” değişkeni global tanımlanan “name” değişkenini dikkate almamıştır.

Bu gibi durumlar, bazen istemediğimiz sonuçlara yol açabilir. Örneğin bir değişkenin unutularak tekrar değiştirilmesi sonucu yanlış bilgi alınması veya verilmesi gibi durumlar yaşanabilir. Çünkü global olarak tanımlanan değişkenlere web uygulamanızın her yerinden ulaşabilirsiniz.

Bu gibi çakışma sorunlarını bertaraf etmek için Javascript tarafında faydalanabileceğimiz birkaç yöntem mevcuttur. Bunlar:

  • Hemen cevap veren fonksiyonlar
  • Namespace (Ad alanları)

Hemen Cevap Veren Fonksiyonlar

Hemen cevap veren fonksiyonlar, tanımlandığı anda çalışan fonksiyonlardır. Yani bir yerde tanımlayıp başka yerde çalışan fonksiyonlar gibi değillerdir. Hemen cevap veren fonksiyonları anonim fonksiyon gibi iki parantez içine sarmalayarak hemen çalışır hale getirebiliriz.

Örnek:

<script type="text/javascript">

    (function () {
         var firstName = "Bayram";
         var lastName = "Üçüncü";
         var fullName = firstName + " " + lastName;
    })();

</script>

Tarayıcı bu fonksiyonu gördüğü anda çalıştırır. Fonksiyon içinde tanımlanan değişkenler global ad alanını (namespace) boşuna kirletmemiş olur. Mesela “firstName” değişkenine bu fonksiyon dışından erişmek mümkün değildir.

Namespace (Ad Alanlarının Kullanımı)

Global değişkenlerin çakışmalarını gidermek için kullanılan bir diğer yöntem ise namespace kullanımıdır. Javascript ortamında namespece içerisine değişkenler ve fonksiyonlar tanımlamak mümkündür.

Örnek:

<script type="text/javascript">

     var MyGlobalMapNamespace = {

          getMapName: function () {
                return "Nokia Maps";
          },
          getMapExtent: function () {
                return "411124, 552442, 4253211, 4011225";
          },
          gtMapLayers: function () {
                return 4;
          },
          owner: "Bayram Üçüncü"
     }
</script>

Bu örnekte tanımladığımız MyGlobalMapNamespace namespace içindeki üyelere şu şeklide erişmek mümkündür:

       MyGlobalMapNamespace.getMapExtent();
       MyGlobalMapNamespace.owner="Bayram";

Namespace içerisinde tanımlı üyelere bir gizlilik veya kapsülleme(encapsulation) yapmak söz konusu değildir. Namespace adı ile içerisindeki üyelere dışarıdan erişim mümkündür.

Bu şekilde Javascript ortamında değişkenlerle ilgili erişim bölgelerini yani kod kapsamına giren ve girmeyen bölgeleri incelemeye çalıştık. Global ve Yerel değişkenlerin hangi kapsamlarda kaldığını, değişken çakışmalarında alınacak önlemleri inceledik. Bir sonraki yazıda görüşmek dileğiyle.

JavascriptSerializer MaxLength Değerinin Aşılması

1 Haz

.Net Framework üzerinde veri transfer mekanizmalarını oluştururken attığımız adımlardan biri de serileştirme işlemidir. Serileştirme işlemlerini Binary, XML veya JSON formatlarında yapabilmekteyiz. Bu yazıda, JSON serileştirme işlemini gerçekleştirirken karşılaşılan bir sorun olan varsayılan olarak ayarlanmış maksimum JSON serileştirme değerinin aşıldığı durumlarda alınan hataları bir ölçüde bertaraf etmeyi inceleyeceğiz.

Örnek uygulamaya geçmeden önce .Net Framework ortamında JSON formatında serileştirme işlemi için gerekli olan ekipmanlardan bahsedelim. Bir nesnenin JSON formatında serileştirilmesi(serialization) veya JSON formatındaki bir verinin .Net nesnesine dönüştürülmesi(deserialization) işlemi için kullanılan referens “System.Web.Extensions”. Projemize bu referansı ekledikten sonra artık ihtiyaç duyduğumuz JavascriptSerializer sınıfına ulaşabiliriz.

Örnek uygulamamızda, verinin büyük olmasını amaçladığımız için bir dosyayı okuyarak JSON formatına dönüştüreceğiz.

Dosya okuma işlemi için aşağıdaki gibi basit bir metod oluşturuyoruz.

private static string readFile()
{
     const string targetDataFile = @"D:\data.txt";

     StreamReader reader = new StreamReader(targetDataFile);

     var result = reader.ReadToEnd();

     return result;
}

Bu metoddan elde ettiğimiz veriyi ise JSON dönüşümünü yapmak için bir başka metod içerisinde kullanıyoruz.

private static string getSerializedFile()
{
    var data = readFile();

    var serializer = new JavaScriptSerializer { MaxJsonLength = int.MaxValue };

    var serialized = serializer.Serialize(data);

    return serialized;
}

Serileştirme işlemi JavascriptSerializer sınıfının Serialize() metodu yardımıyla gerçekleştirilmektedir. JavascriptSerializer sınıfı, MaxJsonLength adında bir property barındırmaktadır. Aksi belirtilmediği taktirde bu property değeri 4MB veriye karşılık gelecek şekilde 2097152 olarak alınır. 4MB’tan fazla veriler için serileştirme sırasında hata verecektir. Bu property için buradan bilgi alabilirsiniz.

Hata InvalidOperationException başlıkı olup, içeriği şu şekildedir: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

Örnek uygulamamızda MaxJsonLength property değerini int.MaxValue olarak belirledik. Bu da yaklaşık 2GB civarı bir büyüklüktür.

TypeScript nedir?

31 Ara

Anders Hejlsberg yine sahnede ve yeni bir dilin tanıtımını yapıyor. Karşımızda TypeScript. Javascript ile tanışanların kafasında bu dil ile nesnel bir yapıda kodlamanın nasıl yapabileceği sorusu yatabilir. Çünkü javascript ile kodlama yapmak biraz zordur. Sonuçta javascript bir programlama dili değil bir scritpt dilidir. Bu sebeple nesnel programlamanın temellerini oluşturan class, interface ve modüller gibi bazı kavramların kullanılamamasından doğan zorluklar yaşanmaktadır. Javascript’in büyük uygulamalara yön verir hale geldiği günümüzde bu gibi zorlukların aşılması için, bazı geliştiriciler tarafından JQury, script# gibi çeşitli amaçlara hizmet eden ve kodlama kolaylığı sağlayan kütüphaneler oluşturulmuştur. Bu kütüphaneler yardımıyla kod geliştirme ortamlarında (IDE) intellisense kullanımı ve hazır bir takım kodlanmış yapılar sunulmuştur. Ancak bu artık javascript’te programlama mantığı değiştiğini göstermemektedir. Tam da bu noktada bünyesinde javascript’in özelliklerini barındıran ve yazılan kodları düz javascript kodlarına çeviren TypeScript dili Microsoft tarafında duyurulmuştur.

TypeScript dili Visual Studio geliştirme ortamında kullanılabilmekte ve intellisense özelliği sayesinde kodlama kolaylığı sağlamaktadır. Class, interface, module gibi tipler oluşturulabilmekte ve kullanılabilmektedir. Typesctipt kodlama tecrübesini denemek için online ortamda dilin resmi web sitesinde buradan faydalabilirsiniz.

Typescritp örnek kodlamalarını ileriki yazılarımızda incelemeye çalışacağız. Tekrar görüşmek dileğiyle.