GELECEĞİ YAZANLAR BLOG

ASP.Net ile HttpHandler Kullanımı

Mustafa Tayyip Yetiş - 14 Kasım 2016

httphandlerMerhaba, bu makalemde HttpHandler kullanımını basitçe anlatacağım. Bazı noktalarda önemli problemleri çözdüğüne şahit olduğum için bu konu hakkında ufak bir makale yazmaya karar verdim. Örnek bir problemden bahsetmek gerekirse; web sitelerinde çok farklı sebeplerden resim kullanılabilir. Tanıtım, profil, reklam vb. amaçlarla yoğun olarak resim dosyalarını web sayflarında göstermek isteriz. Fakat bazen web sunucusu url olarak girilen resim dosyasını dosya sistemi üzerinde bulamayabilir. Bu problemin başlıca sebepleri; dosyanın sunucuda silinmiş olması ya da yanlış resim url’ sinin girilmesi ki dinamik olarak oluşruruluyorsa sık karşılaşılabilir. Bu durumda sunucumuzdan istenen her resim dosyasının önce var olup olmadığını kontrol edip varsa devam edilmesini yoksa bizim belirlediğimiz default bir resmi göstermesini sağlamak web sayfamızda görüntü kirliliği oluşmasını engelleyecektir. Bu yöntemi resimlerinizi çektiğiniz kod üzerinden de "if else" mantığı ile yapabilirsiniz fakat büyük projelerde her seferinde bu işlemleri yapmak pratik olmayacaktır. Bunun yerine bir handler oluşturup, belirli kriterlerdeki dosya ya da istekleri tutup, kendi istediğiniz cevabı vermesini sağlayabilirsiniz.

HttpHandler İç Yapısı

httphandler2

Bunun bir diğer kullanım alanı yine resimler ile ilgilidir. Büyük boyutlu resim dosyaları web sunucunuzun trafik kotasını hızla dolduracak
daha kötüsü sayfanızın yüklenme hızını düşürecektir. Üstelik bu dosya büyük ebatlarda olmasıda rağmen sayfada küçük bir ebatta görüntüleniyorsa israf oranı daha fazla olacaktır. Böyle bir durumda, yine httphandler kullanarak gelen resim dosyası talebini alıp, istenen resim dosyasını dinamik olarak sıkıştırıp ya da boyutunu küçültüp az boyutlu dosyayı cevap olarak gönderebilirsiniz. Bu konuyla ilgili Buradaki makalemi okuyabilirsiniz. Burada handler değil normal bir aspx sayfası kullandım. Bu iş aynı şekilde handler kullanılarak da yapılabilir.

Resim işlemleri dışında güvenlik için de handler kullanabilirsiniz. Sunucudan herhangi bir istek talep edildiğinde login kontrollerinin yapılmasını, oturum açık değilse, login sayfasına yönlendirme işlemini yapabilirsiniz. Kendinize özel dosya uzantıları oluşturabilirsiniz (bazı durumlarda IIS üzerinde ayar yapmak gerekebilir). HttpHandler' ın daha bir çok kullanım alanı bulunmaktadır. Şunu da söyleyelim ki handler ile yapılan bir çok şeyi standart aspx sayfaları ile de yapabilirsiniz. Bazı geliştiriciler standart aspx sayfalarını kullanmayı tercih etmektedir.

Şimdi örneğimize geçebiliriz. Microsoft’un bize sunduğu özel bir sınıf ile daha kolay işlem yapabilirsiniz. Fakat biz önce diğer yöntemi kullanalım;

Projeniz üzerinde aşağıdaki gibi bir sınıf oluşturunuz.

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

public class Handler1: System.Web.IHttpHandler
{
	public void ProcessRequest(HttpContext context)
	{
		string dosyayolu= context.Request.RawUrl;
		context.Response.ContentType = "image/" + new System.IO.FileInfo(dosyayolu).Extension.Replace(".", "");
		if (System.IO.File.Exists(context.Server.MapPath(“") + dosyayolu)) {
			context.Response.WriteFile(dosyayolu);
		} else {
			context.Response.WriteFile("/defaultresim.jpg");
		}
	}

	public bool IsReusable {
		get { return false; }
	}
}

HttpHandler interface’inden devraldığımız bu sınıf ile gelen istekleri karşılayacağız. İstekler her zaman HttpContext türünden parametre alan ProcessRequest fonksiyonuna düşer. Bu fonksiyonun içinde gelen dosyanın var olup olmadığını kontrol edip, varsa kendisini yoksa bizim belirlediğimiz bir resim dosyasını cevap olarak gönderiyoruz. Burada her türlü dosya işlenebilir. Biz web.config ayarlarında buraya sadece belli uzantılardaki resim dosyalarının düşeceğini belirteceğiz. Bunun için web.config dosyamıza aşağıdaki komutları yerleştirelim.

<configuration>
  <system.webServer>
    <handlers>
      <add name="test" verb="*" path="*.jpg" type="WebApplication1.Handler1"/>
      <add name="test2" verb="*" path="*.png" type="WebApplication1.Handler1"/>
    </handlers>
  </system.webServer>
</configuration>

Burada webServer etiketi altında handler tanımlaması yapıyoruz. Her handler için özel name değeri verilmelidir. verb hangi http komutlarında bu handler’ın tetikleneceğini belirtir ve “GET, PUT, POST, DELETE ” gibi değerler alır. Yıldız (*) ise tüm türlerde tetikleneceğini belirtir. path handler’ın tetikleneceği url yapısını basit olarak temsil eder. Buradaki en büyük dezavantaj Regular Expression yapısının kullanımına izin verilmemesidir. Örneğin; slash (/) işareti klasörü temsil ettiği için klasör yapısı değişen durumlarda hatalara sebep olur. Bunun önüne geçmek için diğer yöntem olan Generic Handler yapısını kullanacağız. Son olarak type özelliği ise belirtilen şartlara uygun istek geldiğinde hangi HttpHandler türündeki class’ın tetikleneceğini belirler. Giriş yapısı “{uygulama namespace adı}.{sınıf adı}” şeklindedir.

Bu ayarları doğru bir şekilde yaptığınızda, örneğin “www.test.com/sonbahar.jpg” url’si ile bir istek geldiğinde bu Handler1 class’ ının içine düşecektir. Generic Handler kullanarak aynı işlemlerin yapımı da oldukça basittir. Yukarıdaki Handler1 sınıfımızı projenize yeni bir Generic Handler Item’ ı ekleyerek içine kopyalayabilirsiniz. Item ismiyle class isminin aynı olmasında dikkat edin. bunun dışında web.config de url yönlendirmesinde değişiklikler yapacağız. Aşağıdaki kodu inceleyin.

<configuration>
 <system.webServer>
  <rewrite>
    <rules>
      <rule name="test" stopProcessing="true">
        <match url="^(.*)\.[jpg, png]+$" ignoreCase="false" />
        <action type="Rewrite" url="Handler1.ashx" appendQueryString="true" />
      </rule>
   <rules>
 </rewrite>
 </system.webServer>
</configuration>

Yukaridaki yapı ile handler tanımlamak yerine url rewrite işlemi yapıp gelen url yapısını standart aspx gibi Handler1.ashx dosyasına yönlendiriyoruz. Bu yöntemin en büyük avantajı match etiketinin url özelliğine Regular Expression ifadeleri girip daha geniş eşleştirmeler yapabiliyor olmamızdır. Örneğin; Yukarıdaki tanımlamada bir dosyanın ana dizinde ya da bir kaç klasör derinde olmasının bir farkı yoktur.

ASP.Net ile HttpHandler kullanımı ile ilgili aktaracaklarım bu kadar, umarım faydalı olmuştur.

Yorum yapmak için Giriş Yapın ya da Üye olun.