Asp.Net Site Açılışlarını Sıkıştırmak Gzip ve Deflate İşlem

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,728
Web sitelerinin daha hızlamasını açılmasını ve site trafiklerinin düşmesini kim istemez. Aynı zamanda arama motorlarıda benzer düşüncelerimizi paylaşıyor. Onlar için robotların daha hızlı bir şekilde sitelerinizi indeksleyebilmesi önemlidir. Bu size hem performans açısından hem de Seo açısından büyük kolaylık sağlayacaktır.

Bir web sayfasını açmak üzere tarayıcınıza tıkladığınızda, arkada bir çok şey olur. Bunlardan biri de, isteğin hangi formatta olacağına karar verilmesidir. Bir web sayfası açmaya çalıştığınızda tarayıcınız sizin için aşağıdakine benzer bir bilgi gönderir.

Gönderdiğiniz bilgilerden Accept: */* ve Accept-Encoding: gzip,deflate satırlarına dikkatinizi çekmek istiyorum. Accept, istemcinin (yani tarayıcınızın) kabul ettiği MIME (Multipurpose Internet Mail Extensions) tiplerini, Accept-Encoding ise kabul ettiği kodlama biçimlerini gösterir.

Tarayıcınız sizin adınıza gzip ve deflate algoritmaları ile sıkıştırılmış verileri kabul ettiğini gönderiyor.

Gzip, özellikle metinlerde etkili bir algoritmadır. Aynı zamanda sıkıştırma/açma hızı yüksek bir algoritma olduğundan sıkça tercih edilir. Ben veritabanı yedeklerimi sunucumdan gzip ile sıkıştırılmış olarak çekiyorum. Bir veritabanından gelen metin tabanlı veriyi 4 te biri oranına kadar düşürebilmektedir.. Mesala benim 53 Kb’lık açılış büyüklüğüne sahip olan sayfamı 13 Kb’ a kadar küçülttü. Web’de CSS, HTML ve JavaScript dosyalarında bu kadar sık kullanışmasının nedeni de tam olarak bu performans.

Asp.Net için Yapılması Gerekenler

Global.asax dosyamıza aşağıdaki değişiklikleri yapmamız gerekmektedir.

Kod:
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>

<script runat="server">
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
	HttpApplication app = sender as HttpApplication;
	string acceptEncoding = app.Request.Headers["Accept-Encoding"];
	Stream prevUncompressedStream = app.Response.Filter;

	if (!(app.Context.CurrentHandler is Page ||
		app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
		app.Request["HTTP_X_MICROSOFTAJAX"] != null)
		return;

	if (acceptEncoding == null || acceptEncoding.Length == 0)
		return;

	acceptEncoding = acceptEncoding.ToLower();

	if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
	{
		// defalte
		app.Response.Filter = new DeflateStream(prevUncompressedStream,
			CompressionMode.Compress);
		app.Response.AppendHeader("Content-Encoding", "deflate");
	} else if (acceptEncoding.Contains("gzip"))
	{
		// gzip
		app.Response.Filter = new GZipStream(prevUncompressedStream,
			CompressionMode.Compress);
		app.Response.AppendHeader("Content-Encoding", "gzip");
	}
}
</script>

Şimdi Bunu açıklayalım.

Global.asax dosyamız içerisinde tüm işlemleri Application_PreRequestHandlerExecute methodu içersinde yürütüyoruz.

Kod:
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
	...
}

Bu metodumuzu oluşturan nesne yi HttpApplication türüne çevirmemiz gerekiyor. Kullanıcı tarayıcısındaki başlıkları bu sayede yakalayacağız. Biz Accept-Encoding başlığını aramaktayız. Tarayıcının Gzip / Deflate sıkıştırmasını destekleyip desteklemediğine burada bakıyoruz. Bunu prevUncompressedStream nesnesine çevirmemiz gerekiyor. Şimdi gelen asp.net kaynağından gelen değerin bir webservis mi yoksa bir asp.net sayfa mı olduğuna karar vermeye çalışıyoruz. HttpRequest koleksiyonunun elamanı olan "HTTP_X_MICROSOFTAJAX” ı arıyoruz. Bu elaman çoğunlukla ajax – asp.net sayfalarında kullanılır. Burada kendimizi güvence altına alıyoruz. Asp.net içeriği sıkıştırıldığı zamanda eğer ajax o an kullanılıyorsa. Sayfa hata verecektir. Bunun için ajax ın aktif olmadığı anı bilebilmemiz gerekiyor.

En sonunda "Accept-Encoding" başlığını kontrol edebileceğiz. Eğer burada boş bir değer alırsak bu bize tarayıcımızın bunu desteklemediği bilgisini verecek. acceptEncoding başlığı için deflate değerimizi aramaya başlayabiliriz artık.

Kod:
if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
	{
		// defalte
		app.Response.Filter = new DeflateStream(prevUncompressedStream,
			CompressionMode.Compress);
		app.Response.AppendHeader("Content-Encoding", "deflate");
	} else if (acceptEncoding.Contains("gzip"))
	{
		// gzip
		app.Response.Filter = new GZipStream(prevUncompressedStream,
			CompressionMode.Compress);
		app.Response.AppendHeader("Content-Encoding", "gzip");
	}

DeflateStream nesnemizi tanımladık ve Response.Filter değerine atadık. Buradaki tüm sayfaya yazmalar için DeflateStream nesnesini çağırdık ve çıkışta sıkıştırma işlemini gerçekleyebildik.

Eğer tarayıcı Deflate’i desteklemiyorsa Gzip ile yapacağız bu işlemi.
 
hocam aynı işlem zaten js ve css gibi metin içeriği üzerinde etkili.
 
Geri
Üst