محتویات
مقدمه
اگر با ASP.net کار کرده اید مطمئنن می دانید که چند روش مختلف برای کنترل خطاها در آن نظر گرفته شده است. روشهایی مانند کنترل خطا در داخل کد توسط بلاک try...catch . کنترل خطای صفحه که در کد مدیریت نشده است و کنترل خطاهایی که در هیچ جای سایت مدیریت نشده اند که با نام application Error شناخته می شوند. کنترل بر خطاهای مدیریت نشده سایت در صورت فعال بودن در بخش CustomErrors از فایل web.Config تعیین می شود.
در اینجا تمرکز من در این کنترل بر روی کنترل خطاهای سایت است. مطمئنن می دانید که نمایش خطاهای دلخواه از طریق بخش CustomErros در فایل web.config امکان پذیر است. عملکرد این بخش به این صورت است که می توان برای هرکد خطا که رخ داده صفحه ای را تعیین کرد تا به جای نمایش صفحه خطای نامفهوم، صفحه مورد نظر را نمایش بدهد. همچنین می توان یک صفحه را مشخص کرد تا به عنوان صفحه عمومی خطاها نمایش داده یشود.
نمونه زیر یک مثال از ننظیم کد مربوط به را نمایش بدهد.
<customErrors mode="RemoteOnly" defaultRedirect="~/services/baderror.aspx">
<error statusCode="400" redirect="~/services/errors/400.htm"/>
</customErrors>
این یک نمونه از تعریف customErrors را نمایش می دهد. ویژگی Mode فعال بودن را در چند حالت تعریف می کند. ویژگی defaultRedirect مسیر فایل خطای عمومی هست، یعنی فایل برای زمانی که هیچ فایل دیگری برای وضعیت خطای پیش آمده مشخص نشده باشد.در سطر بعدی با استفاده از تگ error می توان برای هر کد خطا یک صفحه جداگانه تعریف کنیم. در این مثال برای خطای 404 که همان خطای یافت نشدن فایل یا صفحه است، صفحه 404.htm معرفی شده است.
جزئیات
اگر در هنگام کار با CustomError ها متوجه شده باشید در هنگام وقوع خطایی، صفحه به آدرس معرفی شده برای خطای مورد نظر هدایت می شود. در مثال قبلی ما خطای 404 را معرفی کرده بودیم. این خطا برای زمانی است که صفحه مورد درخواست کاربر یافت نمی شود. در این حالت ASP.NET کاربر را به 404.htm که به عنوان صفحه توضیحات برای این خطا تعریف شده است ، هدایت می کند.
تا اینجای کار مشکلی وجود ندارد. در این روش که ASP.NET برای نمایش خطاها استفاده می کند دو مشکل وجود دارد. ASP.NET برای هدایت کاربر از کد پیغام 302 استفاده می کند که این پیغام به معنی است که صفحه مورد نظر در آدرس متفاوت یافت می شود. موتور پویشگر گوگل این صفحات را با فرض اینکه در آدرس جدید و صحیح قابل بازیابی است در ایندکس خود ثبت می کند. اگر سایت شما همچنین دارای چنین مشکلی باشد ممکن است آدرس صفحات خطای خود را در گوگل مشاهده کنید که البته این بسیار بد می تواند باشد، و به وجهه سایت می تواند تاثیر منفی داشته باشد.
این امکان وجود دارد که با استفاده از این ابزار بر این مشقل فائق آمد. روش پیاده سازی آن در ادامه توضیح داده خواهد شد.
مشکل بعدی با روش استفاده شده توسط ASP.NET این است که آدرس صفحه وارد شده تغییر می کند و کاربران را دچار مشکل و سر در گمی می کند. برای مثال آدرس صفحه ای را وارد می کنیم که آصلا وجود ندارد. مانند:
mySite.com/ThereIsNoSuchPage.aspx
در این حالت ASP.NET ما را به صفحه خطایی معرفی خواهد کرد که در فایل Web.config و در CustomErrors معرفی کرده ایم. مثلا آدرس مانند زیر:
mySite.com/404.htm?aspxerrorpath=ThereIsNoSuchPage.aspx
همانطور که میبینید امکان تشخیص صفحه ای که در آن خطا رخ داده برای کاربر سخت است. اگرچه برنامه نویس می تواند با نگاه کردن به پارامتر aspxerrorpath صفحه خطا را تشخیص دهد.
با این حال این ابزار این مشکل را نیز برای شما رفع خواهد کرد.
روش کار CustomErrorHandler در ASP.NET
قبل از استفاده از این ابزا باید بخش CustomError را در فایل web.config تکمیل کنید. اگر هنوز این کار را نکرده اید می توانید از راهنمای ابتدای برنامه استفاده کنید.
این ابزار به عنوان یک HttpModule توشته شده است که باید به سایت اضافه یشود. روش کار به این صورت است که زمانیکه خطایی در سایت رخ بدهد که در هیچ جا مدیریت نشده است، این ابزار فعال شده و خطا و کد آن را بدست خواهد گرفت. با استفاده از این کد خطا بخش CustomError در فایل Web.Config بررسی خواهد شد تا فایلی که توصیحات خطا در آن قرار دارد را پیدا کند. در صورتیکه چنین فایلی تعریف نشده باشد از فایل عمومی خطاها که در defaultRedirect تعریف شده است استفاده خواهد شد. پس از آن بدون آنکه کاربر به صفحه دیگری هدایت شود پیغام خطای سفارشی را در همان صفحه نمایش خواهد دادوبرای مثال اگر در سایتی که از این ابزار استفاده می کند آدرسی را وارد کنید که اصلا وجود ندارد خطای 404 رخ خواهد داد که اگر این خطا را به عنوان CustomEror معرفی کرده باشید، صفحه بدون اینکه به جای دیگری هدایت شود پیغام خطای سفارشی را نمایش خواهد داد.
مزیت فوق العاده ای که این ابزار دارد جلوگیری از انتقالهای بی مورد و شناخت راحت تر خطای رخ داده است.
با استفاد از این ابزار موتور جستحو گر گوگل نیز متوجه وجود خطا در صفحه خواهد شد و از اندیس کردن آن خودداری خواهد کرد. همچنین اگر از ابزار مدیرتی Google WebMaster tool استفاده کنید، این ابزار باعث خواهد شد تا خطاهای رخ داده در بخش مشخص از ابزار مدیریتی گوگل برای پیگیری های بعدی ثبت شوند.
به طور خلاصه با استفاده از افزونه Firebug نتایج زیر حاصل شده است.

بروز خطای شماره 500 با استفاده از حالت عادی ASP.NET
این تصویر نتیجه بروز یک خطا در روش عادی و یا استفاده از روش استاندارد ASP.NET است. همانطور که مشاهده می کنید هیچ کد خطایی ارسال نمی شود و همچنین دو درخواست نیز به سرور ارسال شده است.
تصویر زیر بروز همان خطا را با استفاده از ابزار CustomErrorHandler نمایش می دهد.

بروز خطای شماره 500 با استفاده از CustomErrorHandler
همانطور که مشاهده می کنید سرور کد خطای 500 را برگردانده است که به راحتی قابل شناسایی است. همچنین هیچ انتقالی به صفحات دیگر صورت نگرفته و خطا در همان صفحه نمایش داده است.
روش نصب و پیاده سازی
روش نصب این ابزار بسیار ساده است. لطفا مراحل زیر را دنبال کنید:
- اضافه کردن Reference به پروژه:
برای اضافه کردن Reference بر روی پروزه کلیک راست کنید و از منوی باز شده گزینه Add Reference... را انتخاب کنید. سپس فایل CustomErrorsHandler.dll را انتخاب کنید.
- اضافه کردن به فایل Web.Config:
فایل Web.config را بازکرده و کد زیر را در بخش system.web اضافه کنید:
<httpModules>
<add name="CustomErrorsHandler" type="System.Web.CustomErrorsHandler"/>
</httpModules>
اگر قبلا بخش httpModules وجود داشت می توانید فقط کد زیر را به آن اضافه کنید.
<add name="CustomErrorsHandler" type="System.Web.CustomErrorsHandler"/>
- اضافه کردن CustomErrors به فایل web.config
در مورد CustomErrors در ابتدای مقاله توضیحاتی داده شده که می توانید برای کسب اطلاع به آنجا رجوع کنید. بخش CustomErrors را باید در داخل بخش system.web اضافه کنید. کد زیر یک نمونه CustomErrors را نمایش می دهد.
<customErrors mode="RemoteOnly" defaultRedirect="~/error.aspx">
<error statusCode="400" redirect="~/404.htm"/>
</customErrors>
در این کد صفحه خطای پیش فرض بر روی error.aspx تنظیم شده است. همچنین خطای شماره 404 به صفحه 404.htm اختصاص داده شده است.
سایر تنظیمات و امکانات
تعدادی ویژگی و تابع کلاس CustomErrorsHandler در اختیار قرار می دهد که به اختصار آنها را توضیح می دهم:
ویژگی Enabled
این ویژگی فعال یا غیر فعال بودن این ابزار را تعیین می کند. این ویزگی در حالت عادی فعال است.
در صورتی که مقدار false به آن داده شود ابزار غیر فعال شده و از متد استاندارد ASP.NET برای نمایش خطاها استفاده خواهد شد.
ویژگی SwitchToStandardInUnknownState و DefaultMessage
ویژگی SwitchToStandardInUnknownState تعیین می کند زمانی که هیچ پیغام مرتبطی به خطای رخ داده شده یافت نشود از حالت استاندارد ASP.NET استفاده کند یا نه. استفاده از حالت استاندارد باعث هدایت به صفحه یا نمایش چزئیات خطاهاست. این ویژگی در حالت عادی فعال است.
در صورتی که مقدار false به آن داده شود، به جای استفاده از روش استاندارد ASP.NET پیغام خطای موجود در ویژگی DefaultMessage نمایش داده خواهد شد.
ویژگی DefaultMessage مقداری از نوع Html می پذیرد و به عنوان پیغام پیش فرض استفاده می شود.
تابع RaiseException
با استفاده از این تابع می توان یک خطا تولید یا شبیه سازی کرد که نتیجه ان نمایش پیغام خطای مربوط به کد خطا می باشد. در حقیقیت این تابع برای شبیه سازی خطا می تواند مورد استفاده قرار گیرد. ورودی این تابع از نوع statusCode است که کد وضعیت خطا را مشخص میکند.
تاثیر ویژگی mode در customErrors
ویژگی mode که در بخش customErrors از فایل Web.Config تعریف می شود فعالیت این بخش را مشخص می کند. این ویزگی دارای سه مقدار است که به ترتیب همراه با توضیحات آنها عبارتند از:
- Off: باعث خواهد شد که کلا این ابزار و customErrors غیرفعال شوند. پیغام خطاهای استاندارد ASP.NET برای همه خطاها نمایش داده خواهند شد.
- On: این ابزار در هر حالتی فعال خواهد. مهمترین تاثیر آن در سیستم توسعه یا local مشخص می شود که پیغام خطاها به صورت سفارشی و شیوه مورد استفاده در این ابزار نمایش داده خواهند شد.
- RemoteOnly: باعث خواهد شد که ابزار فقط تاثیر خود را بر روی سرور نمایش دهد. یعین بر روی سیستم local یا همان سیستمی که در حال توسعه سایت بر روی آن هستید از روش استاندارد ASP.NET استفاده خواهد شد و در سرور و محل اصلی سایت از روش مورد استفاده این ابزار.
خلاصه
در این مقاله کوتاه به بررسی ابزار CustomErrorHandler پرداخیتم که به ما این امکان را می دهد که شیوه نمایش خطاها را تغییر دهیم. این خطاها از لحاظ ساختار بسیار استاندارد تر و از لحاظ گوگل قابل تشخیص تر هستند.