۱۳۸۷/۱۱/۲۱

سريع‌تر كردن عمليات دريافت‌ اطلاعات از وب، توسط يك برنامه ASP.Net


فرض كنيد يك برنامه ASP.Net نوشته‌ايد كه كار آن نمايش يك سري فيد از سايت‌هاي مختلف است يا دريافت وضعيت آب و هوا از يك وب سرويس و نمايش آن در سايت مي‌باشد و امثال آن (استفاده از WebRequest ، WebClient ، XmlDom/Reader و ...).
اگر همين عمليات را يكبار با ASP.Net 1.1 و بار ديگر با ASP.Net 2.0 به بالا انجام دهيد، متوجه تفاوت سرعت دريافت قابل تاملي خواهيد شد (ASP.Net 2.0 به بعد حدودا تا 10 ثانيه كندتر عمل مي‌كند). علت چيست؟
در دات نت 1.1 ، تنظيمات پروكسي پيش فرض در كتابخانه‌هاي مربوطه وجود نداشت و به نال تنظيم شده بود. در دات نت 2 به بعد اين مورد به پروكسي پيش فرض سيستم، تنظيم شده است. پروكسي پيش فرض سيستم همان تنظيماتي است كه در internet explorer صورت مي‌گيرد.
كاربر پيش فرض ASP.Net (مثلا NETWORK SERVICE) دسترسي خواندن اين اطلاعات را از رجيستري ويندوز ندارد. علت اين وقفه هم همين مورد است! (حتي اگر برنامه ويندوزي شما هم دسترسي خواندن اطلاعات كليدهاي HKLM رجيستري ويندوز را نداشته باشد، باز هم اين مساله رخ خواهد داد)
دات نت فريم ورك سعي مي‌كند تا اين تنظيمات را از رجيستري يا مكان‌هاي ميسر ديگر بخواند و در آخر پس از شكست كليه حالات مختلف، كلاينت را به صورت مستقيم متصل خواهد كرد.
خوشبختانه اين عملكرد پيش فرض قابل تغيير است. تنها كافي است چند سطر زير را به فايل config برنامه خود اضافه كنيد:

<system.net>
<defaultProxy>
<proxy bypassonlocal="true" usesystemdefault="false" />
</defaultProxy>
</system.net>

با اين‌كار تشخيص خودكار پروكسي سيستم غيرفعال شده و وقفه‌ي معرفي شده ديگر وجود نخواهد داشت.
راه ديگر انجام آن، نسبت دادن نال به خاصيت Proxy شيء HttpWebRequest است كه همين اثر را خواهد داشت.