PDA

View Full Version : HttpHandler چیست ؟



hjran abdpor
چهارشنبه 13 بهمن 1389, 00:48 صبح
با سلام به دوستان گل.
خيلي در مورد بالا شنيدم و خوندم ولي اصلا متوجه نشدم ، ميشه به طور خلاصه بگيين چي هست به چه دردي ميخوره .

aserfg
چهارشنبه 13 بهمن 1389, 09:35 صبح
به طور خلاصه بگيين

سلام دوست من بیاین از اول بررسی کنیم :
هر زمان که شما یه صفحه رو از سرویس دهنده (سرور) در خواست می کنید ابتدا درخواست شما به صورت یه httprequest به سمت سرور ارسال می شه . این درخواست ابتدا به وب سرور (iis) می رسه اونم به asp.net ارجاع می ده . (شما می تونید حتی مقادیر یه درخواست http رو ببینید با استفاده از کلاس httprequest یا حجم درخواست رو و خیلی چیزای دیگه برای مشاهده اطلاعات بیشتر به این آدرس مراجعه کنید :http://msdn.microsoft.com/en-us/library/system.web.httprequest.aspx )
خوب حالا asp.net با توجه به نوع درخواست شما اون رو به یه httphandler(کلاسی است برای پاسخ به درخواستهای وب اپلیکیشنها) ارجاع می ده . مثلا برای پاسخ به یه صفحه اون رو به یه Page Handles که شایعترین هندلرها است ارجاع می ده .
ASP.NET Page Handler ها فقط یک نوع از Handler ها هستند . برای هر اکستنشن فایل شما مثلاaspx یا asmx یه هندلر وجود داره :
ASP.NET Page Handler -----> aspx
Web service handler ----> asmx
ASP.NET user control handler ----> ascx
Trace handler ----> trace.axd این هندلر اطلاعات صفحه ای که در حال نمایش است را ردیابی می کند .


به چه دردي ميخوره .
شما فرض کنید می خواین تمامی تصاویر سایتتون به یه اندازه دلخاواه نشون داده بشن(توسط custom handlers) (به نظرم ملموس ترین مثال برای شما همین باشه ) یا می خواین تصاویر captcha تولید کنید(توسط generic handlers) .....


موفق باشید .

میلاد رئیسی
شنبه 20 آبان 1391, 11:42 صبح
البته ما بیشتر با Generic HttpHandler ها کار می کنیم ، بنده خیلی به این Generic ها علاقه دارم برای اینکه خیلی کار رابندازه ، در حقیقت درخواست های روی Http را هندل می کنه .

کار باهاش سادست ؛ وارد منوی Add New Item می شوید و یک Generic Httphandler اضافه می کنید ، بیشتر برای نوشتن روی Context صفحه بکار میره .

حالا شاید بپرسید چرا از یک صفحه aspx استفاده نکنیم ؟ جواب اینه که اولا اینها خیلی سریعتر عمل می کنند ثانیه دیگه از System.Web.UI.Page ارث نمی گیره در ضمن چیزی به نام کد های Html هم در کار نیست که در صفحه مزاحم باشند

کاربردها :

1- تصاویر امنیتی

2- کوچک نمایی تصاویر

3- نمایش ایمیل به صورت تصویر (برای جلوگیری از جمع آوری ایمیل ها توسط ربات های خزنده)

و انواع کار بر روی تصویر....

4- استفاده در jQuery Ajax و XHR ، وقتی میخواهید url را در ajax کلاسیک ست کنید که نیازی به کدهای html ندارد بهتر است به جای صفحات aspx از ashx استفاده کنید

و... کاربرهای فراوان دیگر

از خود HttpHandler ها و HttpModule ها هم استفاده های کلی تر می توان کرد مانند Compress کردن صفحه ، UrlReWriting و....

ایمان مدائنی
شنبه 20 آبان 1391, 11:49 صبح
مروري بر HttpHandler

HttpHandler شامل يکسري API هايي جهت انجام امور اشياء Request/Response که با استفاده از آن ميتوانيد انتقال اطلاعات را کنترل کنيد. در اينجا ما بايد يک Handler ايجاد کنيد که در زماني که کسي درخواست يک فايل مثلا doc. ميدهد اجرا شود.

خوب بهتر است مقداري کد نويسي کنيم تا بهتر موضوع مشخص شود و متوجه شويد چطور ميتوان در يک سايت E-Commerce اطلاعات را امن کرد بدون استفاده از تکنيک هاي FTP و نياز به مرورگرهاي خاص.

تغيير Web.Config

مرحله اول: بايد تگ زير را در web.config موجود در فولدري که ميخواهيد آن را Secure کنيد وارد کنيد.
کد:
<HttpHandlers>
<add verb=”*” path=”*.doc” type=”pdfIntercept.pdfHandler, pdfInterceptX” />
</HttpHandlers>
با اينکار در واقع به IHttpHandler ميگوئيم که ما ميخواهيم درخواستهايي که آخر آنها doc است را کنترل کنيم.

مشخصه verb ميتواند حالتهاي POST يا GET يا HEAD داشته باشد که در اينجا ما نوشته ايم * يعني تمامي حالتهاي تقاضا را مورد پوشش قرار مي دهد.

مشخصه Path در واقع آدرسي که بايد مورد بررسي قرار گيرد که با نوشتن doc.* گفته ايم کليه آدرس هاي منتهي به doc

مشخصه Type در واقع کلاس دات نت است که بايد تقاضا را Handle کند. بايد نام کامل کلاس را به صورت زير بنويسيم.

[NAMESPACE].[CL], [EMBLY NAME]

اضافه کردن يک پسوند دلخواه Custom Extension

بايد توجه کرد که بايد پسوند مورد نياز را در IIS هم اضافه کنيم. درضمن سپس تنظيمات دايراکتوري محتوي فايلها را به صورت زير انجام دهيد:

Read : False
Write: False
Directory Browsing: False

حال IIS Manager را اجرا کنيد و سپس Properties/Edit… را انتخاب کنيد آنگاه به بخش Home برويد و دکمه Configuration را بزنيد. سپس بايد پسوند مورد نياز خود مثلا doc, pdf را در صفحه تنظيمات نرم افزار اضافه کنيد. برروي دکمه add بزنيد و اطلاعات مورد نياز را پر کنيد کار بسيار ساده اي است.

بعد از اينکه اينکارها را کرده ايد حال آماده هستيد تا کد مربوط به HttpHandler را بنويسيد.

کد HttpHandler

در زير کد مربوط به HttpHandler ارائه شده است. البته شما خود بايد کد مربوط به Authentication مربوط به سايت خود را در آن قرار دهيد.
کد:
using System;
using System.Web;
using System.IO;

namespace pdfIntercept
{

public cl pdfHandler : IHttpHandler
{

//Notice ProcessRequest is the only method
//exposed by the IHttpHandler
public void ProcessRequest(HttpContext context)
{
try
{
string strString = “yes”;
HttpRequest oRequest = context.Request;
HttpResponse oResponse = context.Response;

//ADD YOUR CUSTOM AUTHENICATION HERE
//ADD YOUR CUSTOM AUTHENICATION HERE
//ADD YOUR CUSTOM AUTHENICATION HERE
//ADD YOUR CUSTOM AUTHENICATION HERE

if (strString == “yes”)
{

//Since they’ve made it this far, they’ve been validated
//by your system…
//We’ll fire up a FileStream object
FileStream MyFileStream;
long FileSize;

//Map the path to the .doc file
//You might need to parse out the Request path to figure out
//what resource they’re actually requesting…
string strMapPath = context.Server.MapPath(”book۱.doc”);
MyFileStream = new FileStream(strMapPath, FileMode.Open);
FileSize = MyFileStream.Length;

//Allocate size for our buffer array
byte[] Buffer = new byte[(int)FileSize];
MyFileStream.Read(Buffer, ۰, (int)FileSize);
MyFileStream.Close();

//Do buffer cleanup
context.Response.Buffer = true;
context.Response.Clear();

//Add the appropriate headers
context.Response.AddHeader(”content-disposition”,
“attachement filename=x.doc”);

//Add the right contenttype
context.Response.ContentType = “application/doc”;

//Stream it out via a Binary Write
context.Response.BinaryWrite(Buffer);
}
else
{

//It’s a bogus request and they weren’t validated.
context.Response.Write(”<b>DENIED</b>”);
}
}
catch (System.Exception err)
{
err.ToString();
}
}

//By calling IsReusable, an HTTP factory can query a handler to
//determine whether the same instance can be used to service
//multiple requests
public bool IsReusable
{
get
{
return false;
}
}
}

}
اگر ميخواهيد پيچيدگي مربوط به binary stream را کم کنيد ميتوانيد از متد Response.WriteFile به صورت زير استفاده کنيد.
کد:
if (strString == “yes”)
{
context.Response.Buffer = true;
context.Response.Clear();
context.Response.AddHeader(”content-disposition”,
“attachement; filename=x.doc”);
context.Response.ContentType = “application/doc”;
context.Response.WriteFile(”pp.doc”);
}
else
{
context.Response.Write(”<b>DENIED</b>”);
}
مراحل کد ارائه شده به صورت زير است:
۱. HttpHandler درخواست مربوط به يک فايل doc را دريافت ميکند.
۲. سپس شما يکسري چک کردن با ديتابيس براي اينکه متوجه شويد کاربر مجاز به استفاده است انجام ميدهيد.
۳. اگر درخواست مجاز بود يک Binary Stream فايل را براي کاربر ارسال ميکند.
۴. اگر درخواست غير مجاز بود برروي صفحه نوشته ميشود Denied

HttpHandler يک ابزار بسيار قوي جهت کنترل دسترسي به محتويات موجود برروي وب سايت شما است.

از اين روش ميتوان در سايتهاي E-Commerce و در جاهايي که لازم دسترسي به يک يا چند فايل محدود شود استفاده نمود. با اين روش ديگر هيچ URL در کار نخواهد بود که کسي بتواند با منتشر کردن آن اطلاعات شما را بردارد.


منبع این مقاله (http://www.gtalk.ir/thread8663.html)

ahmad156
شنبه 20 آبان 1391, 18:25 عصر
دوست عزیز قبلا اینجا بحث شده
http://barnamenevis.org/showthread.php?64655-%D9%86%D8%A7%DA%AF%D9%81%D8%AA%D9%87-%D9%87%D8%A7%DB%8C-HttpModules-%D9%88-HttpHandlers&highlight=httpHandler

saeed_sho
شنبه 20 آبان 1391, 19:26 عصر
آقای مدائنی از این روش میشه برای جلوگیری از دانلود عکس های سایت که در image نشان داده میشوند استفاده کرد فرض کنید یک گالری عکس داریم که نمیخوایم کاربر با راست کلیک و save image as اونها رو کپی یا دانلود کنه
ممنون میشم راهنمایی کنید