|
|
|
BindingFlags bindingFlags = BindingFlags.Instance |
BindingFlags.NonPublic; |
ویا
|
HttpWorkerRequest wr= (HttpWorkerRequest)((IServiceProvider)context).GetService(typeof(HttpWorkerRequest)); |
خوب برگردیم به سراغ HttpHandlerها و
HttpModule ها.
یک HttpHandler کلاسی ست که موظف به Render کردن نوع خاصی از منابع است. به عنوان
مثال همان کلاس Page یک HttpHandler است که موظف به Render کردن محتویات صفحات aspx
می باشد.
یک HttpModule کلاسی ست که می تواند از وقایع (Events) مختلفی که در طی مراحل مختلف
پردازش منبع در Server ایجاد می شود بهره برداری کند. به عنوان مثال یکی از
HttpModule هایی رو که می توانید تصور کنید یک ErrorLogger می تواند باشد که هنگامی
فعال می شود که یک Exception ناخواسته در Web App ایجاد شود.
تصویر زیر نمای گرافیکی از مراحل مختلف پردازش منابع Asp.net را نشان می دهد. توجه داشته باشید که پردازش هنگامی شروع می شود که درخواست به IIS برسد. فرض کنید درخواستی برای منابع Asp.net به IIS ارسال می شود. ابتدا IIS پسوند فایل را بررسی نموده وسپس درخواست را به aspnet_isapi.dll ارائه می کند. سپس aspnet_isapi.dll درخواست را به موتور Asp.net ارائه می کند. در حین چرخه ی زندگی درخواست ممکن است چندین HttpModule اجرا شوند که این بستگی به ثبت شدن و یا نشدن آنها دارد. در پایان درخواست به یک HttpHandler ویژه ارائه می شود.( این HttpHandler ویژه توسط یک HttpHandlerFactory شناسائی می شود.) سپس بعد از پردازش درخواست توسط HttpHandler درخواست چرخه برگشت خود به IIS را طی می کند.

HttpHandler ها امکاناتی دارند که می توانید با استفاده از آنها منابع و یا مسیرهای خاصی را به آنها نسبت دهید و هنگام درخواست آن منابع یا مسیرها از سمت Client، موتور asp.net این درخواست را به HttpHandler شما تسلیم می کند و حالا HttpHandler شما وظیفه ی Render کردن آن درخواست را بر عهده دارد. مثلا در مثال زیر شما تعیین می کنید که در صورتی که کاربر صفحاتی با پسوند ashx را درخواست کرده بود، آنگاه کنترل درخواست به HttpHandler ای که شما مشخص کرده اید هدایت شود.( این کد را باید در web.config در میان تگ های <system.web> و </system.web> قرار دهید.)
|
<httpHandlers> |
هر HttpHandler باید اینترفیس IHttpHandler
را پیاده سازی کند. این اینترفیس دو عضو دارد. یکی خصوصیت IsReusable است که مشخص
می کند آیا یک درخواست دیگر می تواند از نمونه ی آن استفاده کند یا خیر. هنگامی که
یک درخواست از طریق Client به سرور ارسال می شود، موتور Asp.net به ازای پردازش هر
درخواست یک Thread ایجاد می کند. IHttpHandler.IsReusable مشخص می کند که آیا یک
نمونه از کلاس HttpHandler شما می تواند برای پردازش چندین درخواست همزمان مورد
استفاده قرار گیرد یا خیر. در صورتی که HttpHandler شما مقدار true را برای این
خصوصیت باز گرداند، کد موجود در متد ProcessRequest باید ThreadSafe بوده و همچنین
مراقب باشید که هیچ گونه حالتی را نمی توانید در این مد در اختیار داشته باشید.
همچنین در این حالت باید مراقب منابع مشترک که مورد استفاده ی درخواست های همزمان
دیگر می باشد باشید. این حالت نسبت به حالتی دیگر (حالتی که
IHttpHandler.IsReusable شما مقدار false را بر می گرداند) هزینه کمتری من باب
استفاده از منابع سیستمی دارد. مثلا در مثال تولید تصاویر امنیتی با استفاده از
HttpHandler، چون از منابع مشترک استفاده نمی کند و به حالت وابسته نیست می توان
برای پائین آوردن هزینه اشغالی منابع در وضعیتی که چندین Request به صورت
Concurrent پردازش می شود، از حالت Reusable استفاده نمود. البته کارائی این خصوصیت
در سایت های بزرگ که یکباره با طیف وسیعی از درخواست ها مواجه می شوند، محسوس تر
است.
پیشنهاد می کنم اگر تمایل به ایجاد یک HttpHandler داشتید مقدار بازگشتی IsReusable
را با دقت انتخاب کنید. عضو دیگر IHttpHandler متد ProcessRequest است که وظیفه ی
پردازش یک Request را بر عهده دارد.
|
public bool IsReusable |
اما elementهای مهم تگ add میان <httpHandlers>
و </httpHandlers> عبارت است از :
path : مشخص می کند این HttpHandler باید نسبت به چه مسیری و یا چه نوع منابعی گوش
به زنگ باشد. به عنوان مثال path=” *.simg”
verb : مشخص می کند این HttpHandler نسبت به چه نوع Request باید فعال شود. مقادیر
مجاز برای این element عبارت است از GET, POST, HEAD.
با استفاده از تنظیمات زیر در فایل web.config شما می توانید نسبت به معرفی و ثبت
یک HttpModule اقدام کنید.
|
<add name="ModuleName" type=".NET Class, Assembly [,Version=version number] [,Culture=culture] [,PublicKeyToken=token]"/> |
هر کلاس HttpModule باید اینترفیس IHttpModule را پیاده سازی کند. این اینترفیس دو عضو دارد. یکی متد مهم Init است که در آن شما به شیئ HttpApplication دسترسی دارید و با استفاده از آن می تونید وقایعی را که نیاز به Handle کردن دارند را مشخص کنید. مثلا در کد زیر من دو واقعه ی BeginRequest و EndRequest را Handle می کنم.
|
public void Init(HttpApplication context) |
شیئ sender در هر Event همان شیئ HttpApplication است.
با استفاده از مثال حاظر می توانید مراحل مراحل اجرای یک HttpModule و HttpHandler را مشاهده کنید.

نویسنده: سید محمد رضا فراحی
منبع: سایت برنامه نویس
| Titles |
| جستجو در سایت |
| لینک سایر سایت ها |
|
|
|
آخرين به روز رسانی: آمار بازدید: |