ASP.Net ile HttpHandler Kullanımı

  • 1.2.2016
  • tayyipyetis
  • ASP.Net

httphandlerMerhaba arkadaşlar 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 vs. amaçlarla yoğun olarak resim dosyalarını web sayfalrında göstermek isteriz fakat bazen web sunucusu url olarak girilen resim dosyasını dosya sistemi üzerinde bulamayabilir 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 dö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 yine resimler ile ilgili 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ında 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 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). daha bir çok kullanım alanı bulunmakta. Şunu da söyleyelim ki handler ile yapılan bir çok şeyi standart aspx sayfaları ile de yapabilirsiniz bazı geliştiriciler o yöntemleri de kullanmaktadır.

Şimdi örneğimize geçelim. 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şturun.

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; }
	}

}

IHttpHandler interface’inden devraldığımız bu sınıf ile gelen istekleri karşılayacağız istekler 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ız örneğin yukarıdaki tanımlamada bir dosyanın ana dizinde ya da bir kaç klasör derinde olmasının bir farkı yok. İşlemler bu kadar umarım faydalı olmuştur.


Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı

Yorum Gönder

Diğer Makaleler

Etiketler