Asp.NET MVC’de HttpHandler Oluşturma

Merhaba,

Asp.NET MVC projelerinde gelen çoğu talebi Controller katmanında karşılamakta ve kullanıcıya gerekli çıktıyı View katmanında göstermekteyiz. Haliyle amacımız ne olursa olsun gelecek tüm talepleri karşılayabilmek için birer Controller ve View’e ihtiyacımız olmaktadır. Genel geçer alışkanlıklar bizi farkında olmadan böyle şartlandırmış olsada gerçekte hiçte böyle bir zorunluluk bulunmamaktadır. Bu içeriğimizde Asp.NET ve Asp.NET MVC mimarilerinde tüm Page, Controller ve HttpHandler’ları kapsayan ve yapılan tüm taleplerin tetiklediği IHttpHandler arayüzü tarafından bir HttpHandler oluşturmayı ve bu Handler’a bir route ayarlamayı göreceğiz. İşte bu IHttpHandler arayüzü sayesinde Controller ve View’e ihtiyaç duymaksızın gelen talepleri karşılayacak, ardından kullanıcılara gerekli sonuçlar gösterilebilecektir.

Daha fazla uzatmadan örnek bir Asp.NET MVC projesi açarak hayali bir senaryoda konuya direkt giriş yapmak istiyorum.

Şimdi aşağıdaki “OrnekRouteHandler.cs” isimli sınıfı inceleyiniz.

    public class OrnekRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new OrnekHandler(requestContext);
        }
    }

Gördüğünüz gibi “OrnekRouteHandler” sınıfı “IRouteHandler” interfaceini uygulayan bir sınıftır ve birazdan oluşturacağımız route şemasına talep gönderildiği zaman tetiklenecektir. Dikkat ederseniz bu tetiklenme neticesinde “OrnekHandler” sınıfından bir nesne oluşturmakta ve geriye return etmektedir. Şimdi bu sınıfımızı oluşturalım.

    public class OrnekHandler : IHttpHandler
    {
        public RequestContext RequestContext { get; set; }
        public OrnekHandler() { }
        public OrnekHandler(RequestContext RequestContext) { this.RequestContext = RequestContext; }
        public bool IsReusable { get; }

        public void ProcessRequest(HttpContext context)
        {
            //Gelen talebin işlenmesi/işlemleri
        }
    }

“OrnekHandler” sınıfı ise “IHttpHandler” interfaceini uygulayan bir sınıftır. Route şemasına gelen talebi karşılayacak olan “OrnekRouteHandler” sınıfının prosedürel işlemlerini üstlenen “OrnekHandler” sınıfı, içerisinde örneği oluşturulduğu “OrnekRouteHandler” sınıfından gönderilmiş ve constructer tarafından elde edilen RequestContext nesnesini kullanarak “ProcessRequest” metodu içerisinde yapılan talebin kaynağı hakkında yahut başka durumlara özel işlemler gerçekleştirebilmektedir.

Şunu söylemekte fayda var ki, birazdan oluşturacağımız route şemasını tetiklediğimiz anda Controller ve View olmaksızın “ProcessRequest” metodu tetiklenecek ve istenen ne ise çıktı olarak elde edilecektir.

Şimdide bu adımda route şemamızı oluşturalım. “App_Start” klasörü altındaki “RouteConfig.cs” dosyasına aşağıdaki gibi bir route ekliyoruz.

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.Add(new Route("laylaylom", new OrnekRouteHandler()));

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

Evet, dikkat ederseniz “laylaylom” diyerek salladığım bir route şeması belirlemiş olduk. Şimdi gelin projemizi derleyip çalıştıralım ve “laylaylom” linkine bir talepte bulunalım.

Yukarıdaki videodan da gördüğünüz gibi “ProcessRequest” talep neticesinde çalışmaktadır.

Peki, şimdi sayfamızda herhangi bir çıktı oluşturalım.

.
.
.
        public void ProcessRequest(HttpContext context)
        {
            HttpContext.Current.Response.Write("Laylaylom galiba sana göre sevmeler");
        }
.
.
.

Yeniden projemizi derleyip çalıştıralım. Muhtemelen aşağıdaki ekran görüntüsündeki gibi bir sonuçla karşılaşacaksınız.

Asp.NET MVC'de HttpHandler Oluşturma

Evet, görüldüğü üzere ne Controller ne de View katmanlarına elimizi sürmeden talepleri işleyebildik. IHttpHandler arayüzü bizlere serverda yapılacak salt işlemleri bu şekilde az maliyetle karşılamamızı sağlayan bir yapı sunmaktadır. Anlaşılan taleplerin kullanıcı isteğinden çok, sayfa yüklemeleri ve sistem gereksinimlerinden kaynaklandığı durumlarda kullanılabilecek bir yöntemdir diyebiliriz. Örneğin; dinamik olarak boyutlandırılan resimleri Controller’da işleyip View’de <a href=”…”>…</a> tagını kullanarak yayınlamaktansa bu talebi özel bir route şemasını tetikleterek özel bir Handler üzerinde yapmak ve dönen sonucun ContentType özelliğini resim olarak ayarlamak daha teknik ve makul bir yaklaşım olabilir…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 04 Şubat 2019

    […] belli başlı isteklere özel cevaplar verebiliriz. Aslında bizler bu konuya dair önceden Asp.NET MVC’de HttpHandler Oluşturma başlığı altında bir değerlendirmeyi standart Asp.NET MVC için kaleme almış bulunmaktayız. […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.