۱۳۸۷/۰۹/۲۴

مطلع شدن از خطاهاي مديريت نشده يك برنامه ASP.Net


راه‌هاي زيادي براي لاگ كردن خطاهاي حاصل در يك برنامه ASP.Net وجود دارند. از روش‌هاي exception handling معمول تا افزودن يك فايل global.asax به برنامه و دريافت و لاگ كردن خطاهاي مديريت نشده توسط روال رخ‌ داد گردان Application_Error آن.
بررسي اين خطاها فوق العاده مهم است ، حداقل به دو دليل : الف) قبل از اين‌ كه كاربران به شما بگويند برنامه مشكل پيدا كرده، از طريق ايميل دريافتي مطلع خواهيد شد. (فرض كنيد علاوه بر ثبت وقايع ، آنها را ايميل هم مي‌زنيد) اين مورد در جهت بالا بردن كيفيت كار تمام شده واقعا مؤثر است. ب) رفتارهاي مخرب را هم بهتر مي‌توانيد تحت نظر داشته باشيد.

تمام اين موارد مستلزم كد نويسي است. دريافت خطا در روال Application_Error و سپس كد نويسي براي ارسال ايميل. از ASP.Net 2.0 به بعد اين كار را بدون كد نويسي و با استفاده از امكانات ASP.NET health monitoring نيز مي‌توان به سادگي و دقت هرچه تمامتر انجام داد.

كار زيادي را قرار نيست انجام دهيد! فايل وب كانفيگ سايت را باز كنيد و چند سطر زير را به آن اضافه كنيد (قسمت healthMonitoring و همچنين قسمت mailSettings ):
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="true">
</compilation>
<authentication mode="Windows"/>

<healthMonitoring enabled="true">
<providers>
<add name="EmailProvider"
type="System.Web.Management.SimpleMailWebEventProvider"
from="you@domain.com"
to="you@domain.com"
subjectPrefix="Error: "
buffer="true"
bufferMode="Notification"/>
</providers>
<rules>
<add
provider="EmailProvider"
name="All App Events"
eventName="All Errors"/>
</rules>
</healthMonitoring>

</system.web>

<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\emails"/>
</smtp>
</mailSettings>
</system.net>

</configuration>

در اين مثال قسمت mailSettings طوري تنظيم شده كه ايميل ارسالي در مسير c:\emails جهت مرور نحوه عملكرد اين سيستم، ذخيره شود.



در حالت اجرا بر روي يك سرور ، اين قسمت را مي‌توان به صورت زير تنظيم نمود و آدرس smtp server را توسط آن مشخص كرد تا به صورت خودكار مورد استفاده قرار گيرد:
<mailSettings>
<smtp from="you@domain.com">
<network host="smtp.domain.com" />
</smtp>
</mailSettings>

سيستم ارسال ايميل آن نيز هوشمند است و ميل باكس شما را به يكباره پر نخواهد كرد. اگر در طي يك دقيقه (مقدار پيش فرض) خطاهاي حاصل شده مانند هم باشند، تنها يك ايميل حاوي تمامي آنها را ارسال مي‌كند.

شايان ذكر است از ASP.Net 2.0 به بعد امكان ثبت وقايع در event log ويندوز محدود شده است و اگر نياز به انجام اين كار باشد بايد دسترسي بيشتري را به يوزر asp.net اعطاء كرد. اما با استفاده از روش فوق، جزئيات خطاي حاصل به صورت خودكار به event log ويندوز نيز اضافه مي‌شود.



اگر علاقمند باشيد كه خطاهاي حاصل را در يك ديتابيس نيز لاگ كنيد، به اين مقاله مي‌توان رجوع كرد.