اضافه کردن تصویر به پایگاه داده

 
اضافه کردن تصویر به پایگاه داده

 

در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمی‌توانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.

در این قسمت موارد زیر بررسی می شوند:

  • بررسی پیش نیازهای اضافه نمودن فایل تصویری
  • کار با شیء Stream
  • پیدا کردن اندازه و نوع تصویری که آپلود می شود
  • چگونگی استفاده از متد InputStream


بررسی پیش نیازهای اضافه نمودن فایل تصویری
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند از:

1.       - تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به enctype="multipart/form-data"
- داشتن <
input type=file> که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای
- استفاده از فضانام
System.IO جهت سروکار داشتن با شیء Stream

2.       سه پارامتر بالا در یک صفحه aspx بکار می روند.ما همچنین به پیش نیازهای زیر در SQL Server نیازمندیم:
- داشتن حداقل یک جدول با فیلدی از نوع
image
- بهتر است که فیلد دیگری از نوع
varchar جهت ذخیره تایپ تصویر داشته باشیم


روند کار بدین صورت است که در ابتدا محتویات فایل تصویر خوانده می‌شود و سپس تصویر به جدول افزوده می‌شود. در زیر کد مربوط به رویداد
OnClick مربوط به Submit button که تصویر را خوانده و به جدول SQL اضافه می‌کند، می‌پردازیم:

Public Sub AddPerson(sender As Object, e As EventArgs)
   Dim intImageSize As Int64
   Dim strImageType As String
   Dim ImageStream As Stream
 
   ' Gets the Size of the Image
   intImageSize = PersonImage.PostedFile.ContentLength
 
   ' Gets the Image Type
   strImageType = PersonImage.PostedFile.ContentType
 
   ' Reads the Image
   ImageStream = PersonImage.PostedFile.InputStream
 
   Dim ImageContent(intImageSize) As Byte
   Dim intStatus As Integer
   intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
 
   ' Create Instance of Connection and Command Object
   Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings("ConnectionString"))
   Dim myCommand As New SqlCommand("sp_person_isp", myConnection)
 
   ' Mark the Command as a SPROC
   myCommand.CommandType = CommandType.StoredProcedure
 
   ' Add Parameters to SPROC
   Dim prmPersonImage As New SqlParameter("@PersonImage", SqlDbType.Image)
   prmPersonImage.Value = ImageContent
   myCommand.Parameters.Add(prmPersonImage)
 
   Dim prmPersonImageType As New SqlParameter("@PersonImageType",
SqlDbType.VarChar, 255)
   prmPersonImageType.Value = strImageType
   myCommand.Parameters.Add(prmPersonImageType)
 
   Try
      myConnection.Open()
      myCommand.ExecuteNonQuery()
      myConnection.Close()
      Response.Write("New person successfully added!")
   Catch SQLexc As SqlException
      Response.Write("Insert Failed. Error Details are: " & SQLexc.ToString())
   End Try
End Sub


شیء
PersonImage نام کنترل HTMLInputFile است. در ابتدا ما نیاز داریم که اندازه تصویری که جهت اضافه کردن انتخاب شده را بدانیم که توسط کد زیر قابل اندازه گیری است:

intImageSize = PersonImage.PostedFile.ContentLength


سپس نوع تصویر را با استفاده از خاصیت
ContentType دریافت می کنیم. حال باید یک استریم از تصویر مربوطه دریافت شود:

ImageStream = PersonImage.PostedFile.InputStream


در اینجا ما یک آرایه از بایتها بنام
ImageContent که آماده نگهداری محتویات تصویر است، داریم. تصویر ورودی توسط متد Read از شیء Stream خوانده می شود. متد Read سه آرگومان می گیرد:
1. موقعیت مکانی که محتویات تصویر در آن باید کپی شود
2. مکان شروع جهت خواندن
3. تعداد بایتهایی که باید خوانده شود

و دستور مربوط به خواندن هم به شکل زیر است:

intStatus = ImageStream.Read(ImageContent, 0, intImageSize)


حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول
SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم. حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم.

فایل
aspx مربوطه:

<%@ Page Language="vb" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.IO" %>
<html>
   <head>
      <title>Inserting Image to a SqlServer</title>
      <script runat=server>
         Public Sub AddPerson(sender As Object, e As EventArgs)
            ' above code
         End Sub    
      </script>
   </head>
 
   <body>
 
      <form enctype="multipart/form-data" runat="server">
         <input type="file" id="PersonImage" runat=server />
         <asp:Button Text="Add Person" OnClick="AddPerson" Runat=server />
    </form>
 
  </body>
</html>


جدول و زیرروال استفاده شده:

Drop Table Person
Go
 
Create Table Person
(
PersonID Int Identity,
PersonEmail Varchar(255),
PersonName Varchar(255),
PersonSex Char(1),
PersonDOB DateTime,
PersonImage Image,
PersonImageType Varchar(255)
)
 
 
Drop Proc sp_person_isp
Go
 
Create Proc sp_person_isp
@PersonEmail Varchar(255),
@PersonName Varchar(255),
@PersonSex Char(1),
@PersonDOB DateTime,
@PersonImage Image,
@PersonImageType Varchar(255)
As
Begin
   Insert into Person 
      (PersonEmail, PersonName, PersonSex, 
       PersonDOB, PersonImage, PersonImageType)
   Values
      (@PersonEmail, @PersonName, @PersonSex, 
       @PersonDOB, @PersonImage, @PersonImageType)
End
 
Go



بازیابی تصاویر از
SQL Server در ASP.NET:
در مقایسه با اضافه کردن تصویر، بازیابی آن بسیار ساده است. تنها چیز جدید برای این قسمت استفاده از متد
BinaryWrite موجود در شیء Response است.

کدهای مورد استفاده جهت بازیابی تصاویر از
SQL Server:

Public Sub Page_Load(sender As Object, e As EventArgs)
 
   Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings("ConnectionString"))
   Dim myCommand As New SqlCommand("Select * from Person", myConnection)
 
   Try
      myConnection.Open()
      Dim myDataReader as SqlDataReader 
      myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
 
      Do While (myDataReader.Read())
         Response.ContentType = myDataReader.Item("PersonImageType")
         Response.BinaryWrite(myDataReader.Item("PersonImage"))
      Loop
 
      myConnection.Close()
      Response.Write("Person info successfully retrieved!")
   Catch SQLexc As SqlException
      Response.Write("Read Failed : " & SQLexc.ToString())
   End Try
End Sub


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

ارسال ایمیل در ASP.NET با استفاده از HTML Template

ارسال ایمیل در ASP.NET با استفاده از HTML Template

 

آیا تاکنون سعی کرده اید برای سایت خود خبرنامه ایجاد کنید؟ آیا تاکنون وسوسه شده اید که سیستمی طراحی کنید که در صورتی که بینندگان سایت شما نظرات خود را در سایت شما وارد کنند برای آنها یک Email تشکرآمیز ارسال کنید؟ آیا می دانید ساختن یک HTML Template زیبا برای خبرنامه شما و استفاده همیشگی از آن جهت ارسال خبرنامه در ASP.NET بسیار ساده صورت می گیرد؟ چنانچه سوالات بالا شما را به دانستن بیشتر ترغیب کرده است به شما تبریک می گویم! چرا که در ادامه این مقاله شما روش بسیار ساده ارسال Emailهای HTML زیبا را بدون اینکه نگران چگونگی کدنویسی HTML متغیر رشته ای Body در MailMessage باشید را فرا خواهید گرفت.

برای شروع بیایید به روش کار نظری بیاندازیم: خوب احتمالا شما با روش ساختن یک نمونه از آبجکت
MailMessage که در ASP.NET برای ارسال Email استفاده می شود آشنایی دارید (اگر این چنین نیست در ادامه مقاله به طور اجمالی توضیحاتی ارائه شده است) تنها قسمتی که باید مورد توجه قرار دهید این است که چگونه می توانیم Body نامه خود را به فرمت HTML و بدون نیاز به اینکه تمامی تگها را پشت سر هم در یک رشته طولانی و سردرگم کننده تایپ کنیم، درآوریم. یک ایده جالب این است که ما Template نامه خود را با استفاده از ادیتورهای WYSIWYG مثل FrontPage یا Dreamweaver طراحی کنیم و سپس تمامی کدهای HTML آن را درون یک متغیر رشته ای Import کرده و از آن استفاده کنیم. این کار بسیار آسان است. اما می توان این نامه را برای هر کاربر کمی سفارشی (Customize) کرد! برای مثال شما می توانید در ابتدای نامه کاربر را با نام وی مورد خطاب قرار دهید. بهتر است از این پس توضیحات را همراه با کدنویسی دنبال کنیم. (کلیه کدهای Server Side به زبان VB.NET نوشته شده است) سه گام اساسی برای این کار وجود دارد:

1- ساختن
Template مورد نظر شما جهت ارسال Email:
برای این کار کافی است که
Template مورد نظر خود را به فرمت HTML طراحی کنید. این به خود شما بستگی دارد که کدهای HTML را به صورت دستی بنویسید و یا از ادیتورهای WYSIWYG مانند FrontPage یا Dreamweaver یا !GoLive استفاده کنید. تنها تفاوتی که در اینجا وجود دارد این است که شما بایستی قسمتهایی از متن نامه خود را که متغیر هستند (مانند نام گیرنده Email، آدرس پست الکترونیکی وی و ...) را به گونه ای از بقیه قسمتها متمایز کنید. برای مثال اگر شما می خواهید در ابتدای نامه، دریافت کننده نامه را با نام خود مورد خطاب قرار دهید عبارت را به صورت زیر وارد کنید: "سلام "#NAME# لطفا توجه کنید که هیچ محدودیتی در تکنیک به کار رفته وجود ندارد و قرار دادن کاراکترهای ## فقط جهت متمایز ساختن این قسمت از محتوای استاتیک صفحه است و شما می توانید به صور دیگر آن را مشخص کنید مثلا ?NAME? یا هر چیز مشابه دیگر. این قسمت بعدا با نام شخص مورد نظر ما جایگزین می شود. نکته قابل ذکر دیگر اینکه چنانچه قصد دارید نامه خود را فارسی ارسال کنید تگ زیر را فراموش نکنید:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">


2- خواندن فایل
Template جهت قراردادن در Body نامه شما:
پس از اینکه
Template را آماده نمودید بایستی این فایل را بخوانید، قسمتهای مورد نظر (متمایز شده با ##) را با عبارات مورد نظر خود (که می توانید از Database استخراج کنید) جایگزین کنید و این متن را به صورت یک متغیر رشته ای در Body نامه خود قرار دهید (گام 3). این کار به وسیله کد زیر صورت می پذیرد: (قبل از هر چیز شما بایستی Namespace مورد نیاز که در اینجا System.IO می باشد را Import کنید)

Imports System.IO
 
Dim reader As StreamReader
Dim strFileName As String = Server.MapPath("templatel.htm")
Dim strFileText
 
reader = File.OpenText(strFileName)
 
While reader.Peek <> -1
               strFileText += reader.ReadLine()
End While
 
reader.Close()
strFileText = Replace(strFileText, "#Username#", Name.Text)
strFileText = Replace(strFileText, "#MsgID#", Request("MsgID"))
strFileText = Replace(strFileText, "#AuthorID#", Request("AuthorID"))


حال بیایید نگاهی به کد فوق بیاندازیم: در سطر اول شما یک شی از نوع
StreamReader که جهت خواندن فایلهای متنی به کار می رود را می سازید و در سطر بعدی مسیر فیزیکی فایل Template خود را در متغیر رشته‌ای strFileName ذخیره می کنید.

نکته: در صورتیکه بخواهید در فایل کلاس خود از کد فوق استفاده کنید بایستی مسیر فیزیکی فایل را با استفاده از
System.Web.HttpContext.Current.Server.MapPath("template.htm") به دست آورید. اما در Code Behind یک WebForm همان Server.MapPath() کافی است.

سپس در سطر بعدی ما با استفاده از متد
OpenText فایل مورد نظر را باز کرده و متن آن را در Reader قرار می دهیم. حال در یک حلقه While...End While سطر به سطر فایل Template را (که در اینجا کدهای HTML ما هستند) می خوانیم و در متغیر strFileText ذخیره می کنیم. Reader.Peek <> -1 بررسی می کند که آیا به انتهای فایل رسیده ایم یا خیر. پس از اینکه کل فایل را خوانده و در متغیر ذخیره کردیم. شی reader را می بندیم.

در اینجا شما باید
Template نامه خود را برای کاربر خاص Customize کنید. یعنی عبارات محصور شده با ## را با اطلاعات کاربر (که از بانک اطلاعاتی استخراج می شود و یا از یک Query String دریافت می شود) جایگزین کنید. در مثال بالا مقدار اول در Template با مقدار یک Textbox و دو مورد بعدی با Query String های انتهای یک URL جایگزین می شود.

حاصل کار یک متغیر رشته ای به نام
strFileText است که حاوی کد HTML مورد نیاز شما برای ارسال یک HTML Email می باشد. که مثلا عبارت ابتدای آن به صورت زیر در آمده است: "سلام مهدی"

3- استفاده از قالب
Import شده فوق و ارسال Email:
حال به آسانی
Email را ساخته و ارسال می کنیم. بدین ترتیب: (Imports System.Web.Mail را فراموش نکنید!)

'Creating and sending mail to user
Dim objMail As New MailMessage()
objMail.From = "You@YourDomain.com"
objMail.To = Email.Text.Trim
objMail.Subject = "YOUR SUBJECT GOES HERE..."
objMail.BodyFormat = MailFormat.Html
objMail.BodyEncoding = System.Text.Encoding.UTF8
objMail.Body = strFileText
SmtpMail.SmtpServer = "smtp.YOURSERVER.com"
SmtpMail.Send(objMail)


این قسمت نیاز به توضیخ چندانی ندارد. جز اینکه
objMail.To را بایستی به صورت داینامیک (از DB و ...) تغییر دهید (در اینجا مقدار از یک Textbox دریافت شده است)، SMTP Server خود را مشخص کنید و Email را ارسال کنید! به همین سادگی. بقیه موارد بسیار واضح هستند.

لطفا به این نکته توجه کنید که برخی
SMTP Serverهایی که نیاز به Authentication دارند را نمی توان برای این منظور (ارسال Email به آدرس های خارج از SMTP Server فوق) مورد استفاده قرار داد. در این خصوص لطفا به Administrator سرور خود رجوع کنید.

نحوه پردازش صفحات ASP.NET بر روی سرویس دهنده وب

 
نحوه پردازش صفحات ASP.NET بر روی سرویس دهنده وب
 
برنامه های وب از معماری سرویس گیرنده - سرویس دهنده تبعیت نموده و بر روی سرویس دهنده وب مستقر و مسئولیت پاسخگوئی به درخواست های ارسالی توسط سرویس گیرندگان را برعهده خواهند داشت .در سمت سرویس گیرنده ، مرورگر و در سمت سرویس دهنده ، سرویس دهنده وب دارای جایگاهی خاص می باشند . مرورگر ، میزبان برنامه وب بوده و مهمترین وظیفه آن ارائه بخش رابط کاربر یک برنامه وب است . در این راستا ، مرورگر دارای پتانسیل لازم به منظور تفسیر و نمایش تگ های HTML می باشد .در سمت سرویس دهنده ، برنامه های وب با نظارت و مدیریت یک سرویس دهنده وب ( مثلا" IIS ) اجراء می گردند . سرویس دهنده وب ، مسئولیت مدیریت برنامه ، پردازش درخواست های ارسالی توسط سرویس گیرندگان و ارائه پاسخ لازم به سرویس گیرندگان را بر عهده دارد .به منظور قانونمند کردن ارسال درخواست سرویس گیرندگان و ارائه پاسخ سرویس دهنده ، می بایست از یک پروتکل ارتباطی خاص استفاده گردد. پروتکل ، مجموعه ای از قوانین لازم بمنظور تشریح نحوه ارتباط دو و یا چندین آیتم از طریق یک محیط انتقال ( زیر ساخت انتقال داده ) نظیر اینترنت است . در برنامه های وب ( ارسال درخواست توسط سرویس گیرنده و پاسخ به درخواست توسط سرویس دهنده ) از پروتکل ارتباطی HTTP)Hypertext Transport Protocol) ، استفاده می گردد.
ASP.NET پلات فرم مایکروسافت برای طراحی و پیاده سازی برنامه های وب در دات نت می باشد . پس از درخواست یک صفحه ASP.NET توسط مرورگر سرویس گیرنده ، پردازش های متعددی بر روی سرویس دهنده وب به منظور ارائه پاسخ لازم ، انجام خواهد شد.شاید تاکنون سوالات مختلفی در رابطه با نحوه پردازش صفحات ASP.NET بر روی سرویس دهنده ، برای شما مطرح شده باشد :

پس از درخواست یک صفحه ASP.NET ، بر روی سرویس دهنده وب چه اتفاقی می افتد ؟
نحوه برخورد سرویس دهنده وب با درخواست ارسالی توسط سرویس گیرنده چگونه است ؟
تگ های HTML چگونه تولید و برای مرورگر ارسال می گردد؟
و شاید سوالات دیگر!
در این مقاله قصد داریم با نحوه پردازش صفحات ASP.NET بر روی سرویس دهنده بیشتر آشنا شویم . بدیهی است تشریح تمامی مراحل با ذکر جزئیات از حوصله یک مقاله خارج بوده و هدف آشنائی با کلیات موضوع با یک روند مشخص و سیستماتیک است .

مرحله اول : ایجاد یک درخواست HTTP برای یک صفحه ASP.NET توسط مرورگر
پردازش با درخواست یک صفحه ASP.NET که توسط مرورگر ایجاد می شود ، آغاز می گردد .مثلا" یک کاربر ممکن است در بخش آدرس مرورگر کامپیوتر خود آدرس www.srco.ir//Articles/DocView.asp?ID=210 را به منظور دریافت این مقاله وارد نماید . مرورگر در ادامه یک درخواست HTTP را از سرویس دهنده وب محل استقرار سایت Srco.ir ایجاد و درخواست فایل حاوی مقاله را می نماید .

مرحله دوم : دریافت درخواست HTTP ، توسط سرویس دهنده وب
مهمترین وظیفه سرویس دهنده وب ، دریافت درخواست ارسالی HTTP و ارائه منبع درخواست شده درقالب یک پاسخ HTTP است . سرویس دهنده وب ( مثلا" IIS ) ، پس از دریافت درخواست ارسال شده توسط سرویس گیرنده ، تصمیم لازم در رابطه با نحوه برخورد با آن را اتخاذ می نماید. محور تصمیم گیری فوق بر پایه نوع انشعاب فایل درخواستی استوار می باشد. مثلا" در صورتیکه فایل درخواستی دارای انشعاب asp. ، باشد ، IIS درخواست را به سمت asp.dll هدایت تا عملیات مرتبط با آن انجام شود . انشعابات فایل متعددی به موتور ASP.NET ، مپ می گردند . برخی از آنان شامل موارد زیر می باشد :

انشعاب aspx . ، برای صفحات وب ASP.NET
انشعاب asmx . ، برای سرویس های وب ASP.NET
انشعاب config . ، برای فایل های پیکربندی ASP.NET
انشعاب ashx . ، برای هندلرهای سفارشی ASP.NET HTTP
انشعاب rem . ، برای منابع راه دور
و سایر انشعابات دیگر


پس از دریافت درخواست ارسالی توسط سرویس گیرنده ، سرویس دهنده وب آن را در اختیار مسئول مربوطه قرار خواهد داد . مثلا" در صورتیکه درخواست دریافتی مربوط به یک صفحه ASP کلاسیک باشد ، درخواست در اخـتیار asp.dll گذاشته شده و یا در صورتیکه درخواست در ارتباط با یک صفحه ASP.NET باشد ، درخواست در اختیار موتور ASP.NET قرار داده می شود . همانگونه که اشاره گردید ، معیار اصلی در این تصمیم گیری ، نوع انشعاب فایل درخواست شده توسط سرویس گیرنده می باشد . شکل زیر مراحل اول و دوم اشاره شده را نشان می دهد .


منبع : http://www.4guysfromrolla.com

مرحله سوم : عملکرد موتور ASP.NET
پس از درخواست یک صفحه ASP.NET توسط سرویس گیرنده و دریافت آن توسط سرویس دهنده وب ، درخواست دریافتی در اختیار موتور ASP.NET قرار داده می شود . از موتور ASP.NET ، اغلب با نام ASP.NET HTTP pipeline یاد می گردد. علت نامگذاری فوق ، بدین دلیل است که درخواست دریافتی از بین تعداد متغیری از HTTP modules در بین مسیر خود برای رسیدن به یک HTTP handler عبور می نماید . HTTP modules ، کلاس هائی می باشند که امکان دستیابی به درخواست دریافتی را دارا می باشند. این ماژول ها قادر به بازبینی و بررسی درخواست دریافتی و اتخاد تصمیماتی می باشند که مستقیما" بر نحوه گردش داخلی ( روند برخورد با درخواست ) تاثیر خواهد گذاشت . درخواست دریافتی پس از عبور از ماژول های مسخص شده HTTP ، به یک HTTP Handler خواهد رسید . HTTP Handler مسئولیت ایجاد خروجی لازم به منظور ارسال برای مرورگر متقاصی ( ارسال کننده درخواست ) را برعهده دارد. شکل زیر ، pipline یک درخواست ASP.NET را نشان می دهد .


منبع : http://www.4guysfromrolla.com

تعداد زیادی از ماژول های HTTP از قبل ایجاد شده، بصورت پیش فرض در HTTP pipline وجود دارد:

OutputCache ، مسئولیت برگرداندن و Caching خروجی صفحات HTML در صورت نیاز ، برعهده دارد .

Session ، ماژول فوق ، مسئولیت لود Session state را بر اساس درخواست دریافتی کاربر و روش Session که در فایل Web.config مشخص شده است ، برعهده دارد .

FormsAuthentication ، ماژول فوق ، مسئولیت تائید کاربران بر اساس مدل تعریف شده Forms Authentication را در صورت ضرورت برعهده دارد .

و موارد دیگر

به منظورآشنائی با ماژول های پیش فرض، می توان مقادیر نسبت داده شده به عنصر <httpModules> در فایل machine.config را مشاهده نمود. جدول زیر مقدار پیش فرض عنصر <httpModules> را نشان می دهد .

machine.Config: httpModules Section
Path : $WINDOWS$Microsoft.NETFramework$VERSION$CONFIG

<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/>
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/>
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/>
<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule"/>
<add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</httpModules>


هندلرهای HTTP ، نقطه پایان در ASP.NET HTTP pipeline می باشند . مسئولیت HTTP handler ، تولید خروجی برای منبع درخواست شده است . برای صفحات ASP.NET ، این به معنی Rendering ، کنترل های وب به HTML و برگرداندن HTML می باشد. برای یک سرویس وب ، مسئولیت فوق ، شامل اجرای متد مشخص شده و Wrapping مقایر برگردانده شده به یک پاسخ مناسب و با فرمت SOAP می باشد . منابع متفاوت ASP.NET از هندلرهای متفاوت HTTP استفاده می نمایند.هندلرهای پیش فرص استفاده شده ، توسط بخش <httpHandlers> فایل machine.config مشخص شده اند. بخش فوق، شامل کلاس هائی است که یا خود HTTP handler بوده و یا HTTP handler factories ، می باشند. یک HTTP handler factory ، صرفا" یک نمونه از یک HTTP handler را پس از فراخوانی ، برمی گرداند . جدول زیر ، اطلاعات عنصر <httpHandlers> در فایل machine.config را نشان می دهد .

machine.Config: httpHandlers Section
Path : $WINDOWS$Microsoft.NETFramework$VERSION$CONFIG

<httpHandlers>
<add verb="*" path="trace.axd" type="System.Web.Handlers.TraceHandler"/>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
. ...
<add verb="*" path="*.resources" type="System.Web.HttpForbiddenHandler"/>
<add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>
<add verb="*" path="*" type="System.Web.HttpMethodNotAllowedHandler"/>
</httpHandlers>


لازم است به این نکته اشاره گردد که امکان ایجاد HTTP modules و HTTP handler اختصاصی ، توسط طراحان وپیاده کنندگان برنامه های وب ASP.NET نیز وجود دارد . پس از ایجاد ماژول ها و هندلرهای HTTP ، می توان آنان را به pipeline ملحق تا برای تمامی سایت های وب موجود بر سرویس دهنده وب ، قابل استفاده گردند. بدین منظور، می توان تغییرات لازم را در فایل machine.config اعمال تا زمینه استفاده از آنان توسط تمامی برنامه های وب فراهم گردد . در این رابطه می توان تغییرات را در فایل Web.config نیز اعمال نمود، در چنین مواردی امکان استفاده از ماژول ها و هندلرهای HTTP ایجاد شده ، صرفا" برای یک برنامه وب وجود خواهد داشت .

مرحله چهارم : تولید خروجی
آخرین مرحله درارتباط با پردازش یک صفحه ASP.NET بر روی سرویس دهنده وب ، شامل ایجاد خروجی مناسب است . خروجی فوق ، در ادامه از طریق ماژول های HTTP عبور داده شده تا مجددا" به IIS برسد . در نهایت IIS ، خروجی تولید شده را برای سرویس گیرنده متقاصی ارسال می نماید .مراحل لازم به منظور تولید خروجی با توجه به HTTP handler متفاوت بوده و در ادامه صرفا" یک حالت خاص آن را بررسی می نمائیم ( هندلر HTTP که از آن به منظور rendering صفحات ASP.NET استفاده می گردد).
سرویس دهنده وب (IIS) پس از دریافت درخواستی برای یک صفحه ASP.NET ( انشعاب فایل aspx.) ، آن را در اختیار موتور ASP.NET ، قرار خواهد داد. درخواست دریافتی در ادامه از بین ماژول ها عبور داده شده تا به PageHandlerFactory برسد ( در بخش <httpHandlers> فایل machin.config که قبلا" mapping آن انجام شده است ) .

machine.Config: httpHandlers Section :PageHandlerFactory
Path : $WINDOWS$Microsoft.NETFramework$VERSION$CONFIG

<httpHandlers>
...
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
. ...
</httpHandlers>


کلاس PageHandlerFactory ، یک HTTP handler factory است که وظیفه آن ارائه نمونه ای از یک HTTP handlerبوده که قادر به برخورد مناسب با درخواست ارسالی است.مهمترین رسالت PageHandlerFactory ، یافتن کلاس ترجمه شده ای است که نشاندهنده صفحه ASP.NET درخواستی می باشد. در صورتیکه از ویژوال استودیو دات نت به منظور ایجاد صفحات ASP.NET استفاده می گردد ، صفحات وب از دو فایل جداگانه ( یک فایل با انشعاب aspx . ، شامل صرفا" کنترل های وب و تگ های HTML و یک فایل aspx.vb و یا aspx.cs شامل کلاس code-behind ( کد سمت سرویس دهنده ) ) ، تشکیل می گردند. در صورتیکه از ویژوال استودیو دات نت استفاده نمی گردد ، می توان از یک بلاک سمت سرویس دهنده <Script> استفاده تا کد سمت سرویس دهنده را درخود نگهداری نماید . صرفنظر از اینکه از کدام رویکرد استفاده می گردد ، زمانیکه صفحه ASP.NET اولین مرتبه و پس از ایجاد تغییر در تگ های HTML و یا محتوی کنترل وب ، مشاهده می گردد ، موتور ASP.NET یک کلاس که مشتق شده از کلاس System.Web.UI.Page می باشد را ایجاد می نماید . کلاس فوق بصورت اتوماتیک ایجاد و کمپایل می گردد .
Page Class ، عملیات پیاده سازی IhttpHandler را انجام خواهد داد. PageHandlerFactory ، در ادامه بررسی لازم در خصوص وجود یک نسخه کمپایل شده از صفحه ASP.NET درخواستی را انجام خواهد داد. در صورتیکه صفحه ترجمه شده وجود نداشته باشد ، PageHandlerFactory آن را بصورت پویا ایجاد و ترجمه خواهد کرد . کلاس فوق ، در ادامه متد خاصی را به منظور تولید HTML ، فرا می خواند . اطلاعات تولید شده به فرمت HTML ، در نهایـت برای سرویس گیرنده ارسال می گردد.وجود تاخیر در مشاهده صفحات ASP.NET که بر روی آنان تغییراتی اعمال شده است ( HTML و یا محتوی کنترل وب) ، بدین دلیل است که موتور ASP.NET نیازمند ایجاد و ترجمه مجدد کلاس مرتبط با صفحه ASP.NET می باشد.



پس از ایجاد و ترجمه کلاس توسط PageHandlerFactory ، امکان فراخوانی کلاس ایجاد شده به منظور تولید HTML ، فراهم می گردد . فرآیند Rendering که شامل بدست آوردن HTML لازم برای صفحه ASP.NET درخواست شده می باشد از حوصله این مقاله خارج بوده و می توان در این رابطه از مقاله The ASP.NET Page Object Model استفاده نمود .