چرخه حیات MVC (بخش سوم)
یکشنبه 16 اسفند 1394در این مقاله از سری مقاله های چرخه حیات برنامه های MVC قصد داریم نحوه پیاده سازی یک HttpHandler ساده که در آن فقط کاربران را به سایت دیگری هدایت می کنیم آموزش دهیم
در دو مقاله قبلی در مورد چرخه حیات برنامه های 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 هم یک پردازش مستقلی را اجرا می کند بدون این که در خواستی از کاربرها ارسال شود .
- ASP.net MVC
- 2k بازدید
- 6 تشکر