چرخه حیات MVC (بخش سوم)

یکشنبه 16 اسفند 1394

در این مقاله از سری مقاله های چرخه حیات برنامه های MVC قصد داریم نحوه پیاده سازی یک HttpHandler ساده که در آن فقط کاربران را به سایت دیگری هدایت می کنیم آموزش دهیم

چرخه حیات MVC (بخش سوم)

در دو مقاله قبلی در مورد چرخه حیات برنامه های mvc به صورت مفصل صحبت شد .و یک ماژول هم به برنامه خود اضافه کردیم و از ماژول پیش فرض استفاده نکردیم .

چرخه حیات برنامه های mvc بخش اول

چرخه حیات برنامه های mvc بخش دوم

در هر فاز پردازش درخواست کاربر رویدادهای مشخصی رخ می دهد .با استفاده از HttpModule می توانیم در فرایند پردازش تغییراتی را ایجاد کنیم .از مهمترین رویدادهایی که در حین پردازش درخواست وجود دارد که قبلا هم به آنها اشاره شد رویدادهای EndRequest و BeginRequest است .در مقاله قبلی به صورت مفصل راجع به این مسئله صحبت شد .

در این مقاله قصد داریم یک Handler ایجاد کنیم . HttlHandlers یک روند پردازش برای پاسخ به درخواست هایی که از سمت کاربران می آید است .وقتی درخواستی از سمت کاربر می آید به httpHandler مخصوص آن نوع صفحات برای پردازش ارسال می شود .

یک نوع از handler هایی که در پلت فرم .NET وجود دارد Web Service Handler است که مسئول رسیدگی به درخواست هایی با پسوند ASMX را دارد .

در این مقاله قصد ساخت یک handler سفارشی را داریم . HTTPHandlers اینترفیس IHTTPHandler را پیاده سازی می کند .و به درخواست هایی از نوع HTTP پاسخ می دهد .اینترفیس IHTTPHandler دارای دو پراپرتی است .

IsReusable: این پراپرتی یک flag است که می گوید آیا این handler می تواند در خلال درخواست دوباره استفاده شود یا نه

ProcessRequest: یک متد اجرایی از کلاسی است که اینترفیس IHTTPHandler را پیاده سازی کرده باشد و همچنین این متد مسئول ارائه پاسخ به درخواست ها می باشد .

یک کلاس CustomHandler به صورت زیر ایجاد می کنیم

    using System;    
    using System.Web;    
        
    namespace MVC_Life_Cycle.CustomHandlers    
    {    
        public class CustomHandler : IHttpHandler    
        {    
            public void ProcessRequest(HttpContext context)    
            {    
                throw new NotImplementedException();    
            }    
        
            public bool IsReusable { get; }    
        }    
    }  

برای اینکه منظور ما از این کلاس بر آورده شود تغییراتی را در آن ایجاد می کنیم .

    using System;    
    using System.Web;    
        
    namespace MVC_Life_Cycle.CustomHandlers    
    {    
        public class CustomHandler : IHttpHandler    
        {    
            public void ProcessRequest(HttpContext context)    
            {    
                context.Response.Redirect("http://myview.rahulnivi.net");    
            }    
        
            //This is also correct    
            //public bool IsReusable    
            //{    
            //    get { return false;}    
            //}    
        
            //But I have used expression syntax here    
            public bool IsReusable => false;    
        }    
    }   

در اینجا خیلی ساده یک Handler ایجاد کرده و از اینترفیس IHttpHandler     ارث بری کرده ایم .در زیر دوباره این کد را بازنویسی کرده ایم .حال باید این handler ایی که نوشته ایم را ثبت نام  کنیم .در داخل Rote.config تغییرات زیر را اعمال می کنیم .

    using System;    
    using System.Collections.Generic;    
    using System.Linq;    
    using System.Web;    
    using System.Web.DynamicData;    
    using System.Web.Mvc;    
    using System.Web.Routing;    
    using MVC_Life_Cycle.CustomHandlers;    
        
    namespace MVC_Life_Cycle    
    {    
        public class RouteConfig    
        {    
            public static void RegisterRoutes(RouteCollection routes)    
            {    
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    
        
                routes.Add(new Route("home", new NewHandler()));    
        
                //Default Route is very greedy by nature. This will match almost any route. Hence, you need to put the new route above this.    
                routes.MapRoute(    
                    name: "Default",    
                    url: "{controller}/{action}/{id}",    
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }    
                );    
            }    
        }    
        
        public class NewHandler : IRouteHandler    
        {    
            public IHttpHandler GetHttpHandler(RequestContext requestContext)    
            {    
                return new CustomHandler();    
            }    
        }    
    }   

وقتی برنامه را اجرا کنیم و بر روی لینک Home کلیک کنیم به صفحه ای که لینک آن را در داخل Handler نوشته بودیم هدایت می شویم .

ابتدا صفحه زیر را خواهیم دید

اگر بر روی لینک About کلیک کنیم به سایت زیر خواهیم رفت

ماژول های زیادی برای یک درخواست می توانیم بنویسیم ولی فقط یک Handler برای پاسخ به درخواست کافی است .همان طور که تا کنون متوجه شده اید پردازش هر درخواست در ASP فازهای مختلفی دارد که در هر فاز هم اتفاقات مختلفی روی میدهد با کمک Http Module هایی که خودمان می نویسیم می توانیم در هر یک از این مراحل تغییرات دلخواه خود را بدهیم .دو تا از مهمترین این رویداد های BeginRequest و EndRequest است .با توجه به اینکه درخواست ما از چه نوعی باشد HttpHandler مناسب آن یافت شده و درخواست به آن ارجاع داده می شود .

به عنوان مثال handler های خاصی برای پاسخ به سرویس ها و handler هایی برای پاسخ به صفحات asp وجود دارند .

یک Http Handler می تواند   Synchronous یا هم زمان و یا به صورت  Asynchronous یا غیر هم زمان باشد. یک synchronous handler هیچ مقداری را بر نمی گرداند تا زمانی که درخواستی از Http برای آن صدا زده شود . یک asynchronous handler هم یک پردازش مستقلی را اجرا می کند بدون این که در خواستی از کاربرها ارسال شود .

فایل های ضمیمه

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید