ASProxy ابزاری جهت عبور از ف.ی.ل.ت.ر !!!

لینک این مقاله
لینک مقاله به زبان انگلیسی
لینک دانلود پــ.ـراکـ.ــسـ.ـی
نویسنده: سالار

فهرست محتویات:

ASProxy preview

قابلیت های این ابزار:

نحوه نصب و استفاده در سایت somee (برای کاربران مبتدی)

اولین چیزی که احتیاج دارید یک سایت رایگان با پشتیبانی ASP.Net است. که من سایت Somee.com را پیشنهاد می کنم در این آدرس: www.somee.com/FreePackage.aspx

پس از ایجاد سایت خود به یک ابزار FTP جهت انتقال فایل ها نیاز خواهید داشت مانند FlashFXP یا CuteFTP.
برای شروع در نرم افزار Ftp خود روی دکمه یا گزینه connect کلیک کنید و در پنجره باز شده در مقابل قسمت Host آدرس سایت خود مثلا name.somee.com را وارد نمایید سپس به ترتیب قسمتهای Username و Password را با نام کاربری و کلمه عبور تان پر نمایید و پنجره را تایید کنید.
پس از ورود به محیط سایت اگر شاخه ای با نام سایت شما وجود داشت وارد آن بشوید و گرنه مراحل بعدی را ادامه دهید.

تنظیم Somee برای کار با ASP.NET 2

برای کار به سایت somee.com بروید. پس از لاگین شدن به سایت در بخش Control panel بر روی گزینه Web کلیک کنید. در این صفحه که با عنوان General information مشخص شده اطلاعات مربوط به حساب کاربری شما نمایش داده میشود.
در بالای نوشته General information چهار عدد دکمه است که باید روی آخرین با نام IIS Setup کلیک کنید.
در پایین صفحه و بالای دکمه cancel یک لیست کشویی وجود دارد با عنوان ASP.NET Version که از این لیست گزینه 20.50727 رو انتخاب کنید و سپس بر روی دکمه Update کلیک کنید.

آپلود فایلهای مورد نیاز به وب سایت ایجاد شده:

فقط کافی است که تمامی فایل های موجود در شاخه PrecompiledWeb رو به سرور کپی کنید. توجه کنید که محتویات درون آن و نه خود آن شاخه.

اکنون پراکسی شما آماده است و می توانید از آن استفاده نمایید.
برای مشاهده یک نمونه پراکسی که به این طریق ایجاد شده به این آدرس مراجعه نمایید:
http://asproxy3.somee.com

تنظیمات ASProxy

اکثر تنظیمات در فایل Web.Config ذخیره می شوند. این فایل محل ذخیره سازی تنظیمات یک سایت ASP.NET است.

تنظیمات ASProxy نیز در همین فایل و در بخش appSettings از آن قرار دارند. تنظیمات پیش فرض را در زیر مشاهده می کنید:

<appSettings>
    <add key="WebProxyMode" value="0"/>
    <add key="WebProxyHost" value="0.0.0.0"/>
    <add key="WebProxyPort" value="8080"/>

    <add key="ASProxyLoginNeeded" value="false"/>
    <add key="ASProxyLoginUser" value="admin"/>
    <add key="ASProxyLoginPassword" value="admin"/>

    <add key="ASProxyServerPort" value="8080"/>
    <add key="ASProxyServerAdminPassword" value=""/>

    <add key="ErrorLogEnabled" value="false"/>

    <add key="ASProxyAutoUpdateEnabled" value="false"/>
    <add key="ASProxyAutoUpdateInfoUrl" value="http://asproxy.sourceforge.net/update/autoupdate.xml"/>
</appSettings>

در زیر شرح هر یک را مشاهده میکنید:

به روز رسانی خودکار:

یکی از ویژگی های جدیدی که به ASProxy اضافه شده است به روز رسانی خودکار است. این ویژگی به شما این امکان را می دهد که بدون نیاز به دانش اضافی بتوانید پراکسی خودتان را به روز نگه داشته و همیشه از آخرین نسخه آن بهره مند شوید.

این امکان به طور پیش فرض غیر فعال است. پس برای فعال سازی آن مراحل زیر را دنبال کنید:

فایل Web.Config را باز کرده و نام ASProxyAutoUpdateEnabled را در بخش appSettings پیدا کنید. سپس مقدار value ان را برابر با true قرار دهید و تمام.

با فعال سازی این ویژگی، ASProxy هر 21 روز یکبار آدرسی را که در قسمت ASProxyAutoUpdateInfoUrl تعیین شده برای وجود به روز رسان بررسی می کند. اگر نسخه جدیدی وجود داشت آن را به طور خودکار دریافت کرده و بر روی خود نصب میکند و به این ترتیب آخرین نسخه بدست خواهد آمد.

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

ورود ( Login ) اجباری برای استفاده از ASProxy

با استفاده از این ویژگی جدید می توانید دسترسی سایر افراد را از ASProxy قطع کنید. این برای کسانی که سایت خریداری کرده اند و نمیخواهند پهنای باند خود را بی جهت از دست بدهند مفید است. برای فعال سازی آن مراحل زیر را دنبال کنید:

فایل Web.Config را باز کرده و نام ASProxyLoginNeeded را در بخش appSettings پیدا کنید. سپس مقدار value ان را برابر با true قرار دهید.
برای تنظیم نام کاربری، نام ASProxyLoginUser را مانند قبل در بخش appSettings پیدا کنید و مقدار value آن را با هرچه می خواهید مقدار دهی کنید.
برای تنظیم کلمه عبور، نام ASProxyLoginPassword را مانند قبل در بخش appSettings پیدا کنید و مقدار value آن را با هر کلمه ای که میخواهید مقدار دهی کنید تا کلمه عبور نیز تنظیم شود.

از این پس برای دسترسی ابتدا به آدرس login.aspx هدایت خواهید شد و در صورتی که نام کاربری و کلمه عبور را صحیح وارد کنید به ASProxy دسترسی خواهید داشت.

تنظیم پراکسی داخلی برای دسترسی موتور ASProxy به وب

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

در چنین موقعیتی ابزار ASProxy نیز از قاعده مستثنی نیست و باید از پراکسی داخلی شبکه عبور کند. برای این منظور راه حلی اندیشیده شده که نحوه انجام ان بدین شرح است:

برای فعال سازی دسترسی از طریق پراکسی فایل Web.Config را باز کرده و کلید WebProxyMode را در بخش appSettings پیدا کنید. مقدار value آن چند حالت می تواند داشته باشد و از نوع عدد است.
0 :که به معنی غیر فعال بودن این ویژگی است. این مقدار به دلایل امنیتی به طور فرض انتخاب شده است.
1 :که به معنی شناسایی تنظیمات پراکسی به طور خودکار است.
2 :که برای تنظیم دستی مورد استفاده قرار میگیرد. برای انجام تنظیمات دستی باید مقدار WebProxyHost را برابر IP مربوط به پراکسی داخلی شبکه قرار دهید و WebProxyPort را برابر port ویژه مربوط به پراکسی داخلی شبکه.

ضبط خطاهای صورت گرفته

با استفاده از این ویژگی که مخصوص برنامه نویسان در نظر گرفته شده، اگر هر خطای کنترل نشده ای رخ دهد در فایل جدیدی به نام exceptions.xml که از نوع xml هست در فولدر bin قرار خواهد گرفت. برای فعال کردن این ویژگی مراحل زیر را دنبال کنید:

فایل Web.Config را باز کرده و مقدار ErrorLogEnabled را در بخش appSettings پیدا کنید. سپس مقدار value ان را برابر با true قرار دهید و تمام.

تنظیمات ویژه ASProxyServer

ASProxyServer نوع دیگری از پراکسی است که همراه ASProxy عرضه میشود. البته باید متذکر شوم که ASProxyServer همان ASProxy است که قابلیت های آن را در قالبی دیگر و از طریق IP Proxy عرضه میکند. نحوه راه اندازی و به کار گیری آن بدین شرح است:

در بسته همراه ASProxyServer صفحه ServerConfig.aspx نیز عرضه میشود. کافی در مرورگر خود به این صفحه بروید و کلمه عبور مدیریت را که در بخش ASProxyServerAdminPassword از فایل Web.Config مشخص شده را وارد کنید. سپس در صورت تمایل می توانید port مورد استفاده را تغییر دهید.
سپس بر روی دکمه "Start proxy" کلیک کنید تا پراکسی شروع به کار کند. در این حالت وضعیت پراکسی به Listening تغییر خواهد کرد.

برای تنظیم port پیش فرض برای این پراکسی باید مقدار ASProxyServerPort را که در فایل Web.config قرار دارد تنظیم کنید.

برای دسترسی به IP Proxy ساخته شده مراحل زیر را در هر یک از مرورگر ها انجام دهید. توجه کنید که در اینجا منظور از IP همان IP آدرسی است که در آن ASProxyServer را نصب کرده و اجرا کرده اید. برای مثال site.com که می توانید خود ان را بنویسید یا IP متناظر با آن که ممکن است چیزی مثل 65.85.150.15 باشد.

برای InternetExplorer : در ControlPanel قسمت را Internet Options را باز کنید. به تب Connections رفته و بر روی دکمه LAN Settings کلیک کنید. در بخش Proxy Server کادر "User a proxy server for your LAN" را تیک بزنید و در کادر Address آدرس IP را وارد کرده و در کادر port نیز Portی را که در صفحه serverconfig.aspx وارد کرده بودید وارد کنید. سپس OK کنید.

برای FireFox : از منوی Tools گزینه Options را انتخاب کرده و به بخش Advanced بروید. در این بخش روی تب Network رفته و در قسمت Connections دکمه Settings را کلیک کنید. دکمه رادیویی Manual proxy configuration را انتخاب کنید و در کادر HTTP Proxy آدرس IP را وارد کرده و در کادر port نیز Portی را که در صفحه serverconfig.aspx وارد کرده بودید وارد کنید. سپس تیک گزینه Use this proxy for all protocols را بزنید و سپس OK کنید.

نکته: تمامی این تنظیمات را زمانی انجام دهید که در اینترنت هستید. ممکن است در سایر مواقع که در اینترنت نیستید مشکلاتی را برای شما ایجاد کند. برای غیر فعال کردن این تنظیمات در IE گزینه "User a proxy server for your LAN" را حذف کنید و در Firefox گزینه Direct connection to internet را انتخاب کنید.

نکته بسیار مهم: برای اینکه ASProxyServer در وب سایت شما کار کند باید Application Pool که ASProxy در آن در حال اجرا است دارای دسترسی System باشد. این کار را برنامه نصب ASProxyServer برای شما انجام می دهد.
اگر دانش کافی در این زمینه ندارید لطفا تنظیمات را تغییر ندهید.

نحوه عملکرد فیلتر ها:

فیلتر کردن اطلاعات معمولا به چند روش انجام می شود.
روش اول که ساده ترین روش است کنترل آدرس های ورودی و خروجی است؛ بدین ترتیب که ابزارهای فیلتر دارای لیست از سایت های غیر مجاز هستند. در صورتی که هر یک از این آدرس ها در آدرس درخواستی و یا آدرس برگشتی مشاهده شود نرم افزار فیلتر ارتباط را قطع کرده و مانع از دریافت اطلاعات می شود.

روش دوم نیز مانند روش اول دارای لیستی از آدرس ها است ولی علاوه بر آن دارای لیستی از کلمات غیر مجاز نیز می باشد. که به طور هوشمند وجود این کلمات را در آدرس تشخیص داده و مانع از ادامه فعالیت آن سایت می شود.

در روش سوم علاوه بر روش قبلی که اعمال می شود؛ جستجو در میان محتویات سایت برگشتی نیز انجام می شود. به این ترتیب که موتور فیلتر گر در میان متون به دنبال لینک ها و آدرس ها و همچنین کلمات تعیین شده می گردد در صورتی که فراوانی آنها به حدی که به عنوان درصد حساسیت تعیین شده برسد سایت فیلتر خواهد شد. این روش نسبت به دو روش قبلی از قابلیت اطمینان بیشتری برخوردار است ولی سربار زیادی به همراه خواهد داشت و سبب کند شدن ارتباط و سرویس دهی خواهد شد. معمولا در مراکز غیر عمومی که نیاز به کنترل بیشتر بر فعالیت کاربران است از این روش استفاده میشود.
هر سه روش که مطرح گردید بر یک پایه استوار هستند؛ لیستی از سایت ها و لیستی از کلمات غیر مجاز.
حال اگر ما با توجه به قوانین 1 و 2 اقدام به تغییر آدرس سایت کنیم؛ عملا خواهیم توانست ردیاب فیلتر را دور بزنیم. این دقیقا همان روشی است که تقریبا همه ابزار های عبور از فیلتر از آن استفاده می کنند. توجه کنید که در روش سوم با تغییر آدرس سایت تا حدودی امکان عبور از فیلتر افزایش پیدا میکند.

ASProxy چگونه کار میکند

در ASProxy مراحل بدین صورت خواهد بود که کاربر باید وارد سایتی بشود که موتور ASProxy در آن نصب شده است. این سایت ممکن است توسط خود کاربر یا توسط شخص دیگری ایجاد شده باشد. کاربر در قسمت مربوطه آدرس مورد نظر را وارد کرده و در خواست خود را ارسال میکند. درخواست کاربر به درستی به سایت محل نصب ASProxy ارسال خواهد شد؛ که البته این بستگی به این دارد که سایت حاوی ASProxy بیش از حد، عمومی نشده باشد تا باعث شناسایی آن توسط ابزار فیلتر کننده نشود. موتور ASProxy درخواست شما را دریافت و اجرا کرده و داده های سایت مورد نظر کاربر را دریافت می کند. سپس با انجام پردازش های گوناگون اقدام به تغییر آدرس تمامی محتویات که به این سایت مربوط است از محل اصلی به آدرس سایت محل نصب ASProxy می کند و سر انجام نتیجه را به مرورگر کاربر ارسال میکند. در این حالت چون تمامی در خواست ها به و از سایت محل نصب ASProxy ارسال و دریافت می شود و از نظر فیلترینگ این سایت در لیست سیاه قرار ندارد، هیچ مشکلی در ارتباط پیش نخواهد آمد.
در زیر نمودار این فرایند را مشاهده می کنید:

ASProxy working model

Background

ابزار ASProxy دارای چند موتور پردازشی و چند کلاس عملیاتی است که در زیر لیست آنها را مشاهده میکنید:

در بخش DataManagement کلاس های مربوط به پردازش داده های خام قرار گرفته اند. لیست این کلاسها شامل موارد زیر است:

در این بخش کلاس هایی جهت پردازش داده های که بیشتر مربوط به انواع مورد استفاده در Html است قرار گرفته اند.

این بخش به قسمت های کوچکتری جهت شناسایی بهتر تقسیم میشود که نام ها آنها کاربرد خاصی دارد. نام های کلاس های موجود به این صورت شناخته می شوند:

Parser: کلاس های تعریف شده با این پسوند برای یافتن موقعیت تگهای Html و یا تغییر بخشهایی از یک تگ Html مورد استفاده قرار می گیرند.
Processor: کلاسهای تعریف شده با این پسوند مسئول انجام تمام عملیات مورد نیاز مربوط به خود هستند و به طور مستقیم توسط ASProxyEngine مورد استفاده قرار می گیرند.
Replacer: کلاسهای تعریف شده با این پسوند برای تغییر و جایگزین سازی بخش ها و یا قسمتهایی از متن و یا داده (معمولا html) با الگوریتمی که در پیاده سازی کلاس مشخص شده است، مورد استفاده قرار می گیرند.

در نتیجه عملیات بخش DataProcessor در سه قسمت پیاده سازی شده است.

محل ذخیره سازی و بازیابی تنظیمات ASProxy و سایر اطلاعات مورد نیاز است.

کلاس های عمومی و پر کاربرد در این قسمت قرار دارند.

Background working trace (Developers)

در این قسمت نحوه انجام درخواست و به پایان رسیدن آن را نمایش می دهم.

این درخواست برای یک سایت مثلا www.softprojects.org شده است، پس انتظار می رود که محتویات سایت از نوع Html باشند. در زیر مراحل انجام این درخواست برای Html دنبال شده است.

Deep
1
2
3
3
3.1
3.2
3.3
3
-
4
4
4.1
4.2
4.2
4.2.1
4.2.2
4.2.3
4.2.4
4.2
-
4.3
4.3
4.3.1
4.3.1
4.3.1.1
4.3.1.2
4.3.1.3
4.3.1
4.3
4.4
4
5
Execution trace
Request a site:
Initialize an ASProxyEngine
Test content type by PreExecute
{
	IMAGE: Link to images.aspx page and display it in page as img tag. END.
	Unknown: Redirect to download page. END.
	HTML: Continue!
}

in ASProxyEngine
{
	Initialize a WebDataCore
	Execute the request by WebDataCore instance
	{
		Initialize "PostBack" or "Get" methods information.
		Add cookies.
		Get the response.
		Restore returned cookies and save them.
	}
	
	if html process requested
	{
		Test content mime type
		{
			if HTML: Initialize HtmlProcessor and process data.
			if JavaScript:  Initialize JSProcessor and process data.
			if CSS:  Initialize CSSProcessor and process data.
		}
	}
	return processed data.
}
Display response in a label!
توضیحی بر توابع اصلی و نحوه به کارگیری آنها:

در اولین گام که کاربر آدرس سایت را در کادر وارد کرده و بر روی دکمه کلیک میکند لازم است تا یک نمونه از کلاس اصلی برای پردازش درخواست او ایجاد کنیم(مربوط به gethtml.aspx):

engine = new ASProxyEngine(ProcessTypeForData.HTML,true);
engine.RequestInfo.ContentType = MimeContentType.text_html;
engine.Initialize(Request);
engine.Execute(Response);

در این کد تعیین میکنیم که هدف ما داده های نوع html است؛ برای تعیین آدرس درخواست و  آماده سازی ASPrpxyEngine تابع Initialize را فراخوانی می کنیم.

سرانجام برای انجام تمامی اعمال، تابع Execute را برای اعمال مستقیم نتایج بر روی خروجی ( Response) فراخوانی می کنیم.

نحوه پیاده سازی روش فوق بر روی یک صفحه ساده و سفارش سازی آن:

برای این منظور صفحه جدیدی در پروژه ASProxy ایجاد کنید و در آن یک کنترل TextBox و Button و Label روی فرم قرار دهید. برای جلوگیری از سربار اضافی ویژگی EnableViewState مربوط به Label را برابر False قرار دهید. سپس کد های زیر را در رویداد کلیک(Click) مربوط به button بنویسید.

protected void Button1_Click(object sender, EventArgs e)
{
  SalarSoft.ASProxy.ASProxyEngine engine = new SalarSoft.ASProxy.ASProxyEngine(SalarSoft.ASProxy.ProcessTypeForData.HTML);
  engine.RequestInfo.ContentType = SalarSoft.ASProxy.MimeContentType.text_html;
  engine.Initialize(TextBox1.Text);

  string myResponse;
  engine.Execute(out myResponse);
  Label1.Text = myResponse;
}

پروژه را اجرا کرده و آدرس یک URL را در کادر متن وارد کنید و کلید را فشار دهید. صفحه نمایش داده خواهد شد. به همین سادگی.

اما صبر کنید هیچ چیزی در این صفحه کار نخواهد کرد. فقط html نمایش داده شده که آن هم تنهایی به درد نمی خورد! پس برای نتیجه گرفتن باید کد بالا را کمی تغییر داد:

protected void Button1_Click(object sender, EventArgs e)
{
  SalarSoft.ASProxy.ASProxyEngine engine = new SalarSoft.ASProxy.ASProxyEngine(SalarSoft.ASProxy.ProcessTypeForData.HTML, true);
  engine.RequestInfo.ContentType = SalarSoft.ASProxy.MimeContentType.text_html;
  engine.Initialize(TextBox1.Text);

  string myResponse;
  engine.Execute(out myResponse);
  Label1.Text = myResponse;
}

تنها چیز اضافه شده مقدار true به آخر ایجاد کننده کلاس ASProxyEngine است. این باعث مقدار دهی تنظیمات به طور خودکار از کوکی ذخیره شده در سیستم شما و تنظیمات پیش فرض خواهد شد.

اگر می خواهید کنترل بیشتری در تنظیمات داشته باشد می توانید آنها را خودتان به این کلاس تحویل دهید. برای منظور باید از نوع OptionsType استفاده کنید. اگر هم می خواهید تنظیمات ذخیره شده را از این نوع را دریافت کنید باید از کلاس ASProxyConfig استفاده کنید.

به این مثال توجه کنید:

protected void Button1_Click(object sender, EventArgs e)
{
  SalarSoft.ASProxy.ASProxyEngine engine = new SalarSoft.ASProxy.ASProxyEngine(SalarSoft.ASProxy.ProcessTypeForData.HTML, false);
  engine.RequestInfo.ContentType = SalarSoft.ASProxy.MimeContentType.text_html;

  SalarSoft.ASProxy.OptionsType opt = SalarSoft.ASProxy.ASProxyConfig.GetCookieOptions();
  opt.Images = false;
  opt.AcceptCookies = false;
  engine.Options = opt;

  engine.Initialize(TextBox1.Text);

  string myResponse;
  engine.Execute(out myResponse);
  Label1.Text = myResponse;
}

در این مثال تنظیمات پیش فرض با استفاده از ASProxyConfig.GetCookieOptions بازیابی شده است. سپس Images و AcceptCookies غیر فعال شده اند.

تا اینجای کار به نتایج خوبی رسیده اید ولی لینک ها بر روی صفحه شما کار نخواهند کرد و نمایش داده نخواهند شد! برای تنظیم این مورد باید کد های زیر را در رویداد Load صفحه بنویسید.

protected void Page_Load(object sender, EventArgs e)
{
  SalarSoft.ASProxy.FilesConsts.DefaultPage = System.IO.Path.GetFileName(Request.Url.AbsolutePath).ToLower();
  bool isClicked=(Request.Form[Button1.ID]!=null);

  if(isClicked==false && SalarSoft.ASProxy.UrlProvider.IsASProxyAddressUrlIncluded(Request.QueryString))
  {
  SalarSoft.ASProxy.ASProxyEngine engine = new SalarSoft.ASProxy.ASProxyEngine(SalarSoft.ASProxy.ProcessTypeForData.HTML,    false);
  engine.RequestInfo.ContentType = SalarSoft.ASProxy.MimeContentType.text_html;
  SalarSoft.ASProxy.OptionsType opt = SalarSoft.ASProxy.ASProxyConfig.GetCookieOptions();
  opt.Images = false;
  opt.AcceptCookies = false;
  engine.Options = opt;
  engine.Initialize(TextBox1.Text);

  string myResponse;
  engine.Execute(out myResponse);
  Label1.Text = myResponse;
  }
}

در این پیاده سازی FilesConsts.DefaultPage جهت تعیین صفحه جاری به عنوان پیش فرض برای تمامی لینک ها مورد استفاده است. در استفاده از این ویژگی محتاط باشید چون نتایج را به شدت تحت تاثیر قرار میدهد.

نکته بعدی استفاده از تابع IsASProxyAddressUrlIncluded جهت بررسی وجود آدرس درخواست است (Url query).
و نکته دیگر اینکه ارسال درخواست برای زمانیکه بر روی دکمه button1 روی فرم کلیک می کنیم نباید اجرا شود. بررسی این مورد در نحوه مقدار دهی متغیر isClicked نمایش داده شده است.

Implementation

در زیر نحوه پیاده سازی چند تابع اصلی از ASProxyEngine را مشاهده می کنید.

در زیر پیاده سازی تابع Initialize که به دو صورت است را مشاهده می کنید. همچنین دو تابع وابسته InitializeRequestQueriesByHttpRequest و DoAutoDetection را مشاده می کنید.

/// <summary>
/// Initialize ASProxy engine with as HttpRequest
/// </summary>
/// <param name="httpRequest">HttpRequest instance</param>
public void Initialize(HttpRequest httpRequest)
{
  InitializeRequestQueriesByHttpRequest(httpRequest);
  DoAutoDetection(httpRequest);
}

/// <summary>
/// Initialize ASProxy engine with specified url address
/// </summary>
/// <param name="requestUrl">Requested url address</param>
public void Initialize(string requestUrl)
{
  RequestInfo.RequestUrl = requestUrl;
  RequestInfo.RequestedQueries = requestUrl;
  DoAutoDetection(null);
}

private void DoAutoDetection(HttpRequest httpRequest)
{
    if (httpRequest != null)
    {
        RequestInfo.RequestedQueries = GetQueryCollectionString(httpRequest.QueryString);

    // When a post back event occurred "httpRequest.ContentType" contains ContentType of request
    // In other cases the "httpRequest.ContentType" is empty and we shouldn't use this property
    if(!string.IsNullOrEmpty(httpRequest.ContentType))
      RequestInfo.ContentTypeString = httpRequest.ContentType;// Added again in version 3.7
        RequestInfo.InputStream = httpRequest.InputStream;
    }

    // Get posted form data string
    if (RequestInfo.HttpRequestMethod == WebRequestMethod.POST)
    {
        if (httpRequest != null)
        {
            RequestInfo.PostedFormData = httpRequest.Form.ToString();

            // Some web sites encodes the url, and we need to decode it to be usefull
            //RequestInfo.PostedFormData = HttpUtility.UrlDecode(RequestInfo.PostedFormData);
            RequestInfo.PostedFormData = HttpUtility.HtmlDecode(RequestInfo.PostedFormData);
        }
    }
    else
        RequestInfo.PostedFormData = "";


    if(RequestInfo.RequestInQueryMethod== WebRequestMethod.GET)
    {
        // Apply filter for ASP.NET pages
        RequestInfo.PostedFormData = RequestInfo.PostedFormData;

        if (fAutoDetection)
        {
            // Change requested url by posted data
            RequestInfo.RequestUrl =
            	UrlBuilder.AppendAntoherQueries(RequestInfo.RequestUrl,
            		RequestInfo.PostedFormData);
        }
    }

}

/// <summary>
/// Auto detect the request information from HttpRequest
/// </summary>
/// <param name="httpRequest">HttpRequest instance</param>
private void InitializeRequestQueriesByHttpRequest(HttpRequest httpRequest)
{
  if (fAutoDetection)
  {

    // Get http request method
    RequestInfo.HttpRequestMethod = ASProxyFunctions.StringToRequestMethod(httpRequest.HttpMethod);


    bool tmpBool = false;

    // Get requested url
    string url = httpRequest.QueryString[Consts.qUrlAddress];
    if (!string.IsNullOrEmpty(url))
    {
      string decode = httpRequest.QueryString[Consts.qDecode];
      if (decode != null)
      {
        try
        {
          tmpBool = Convert.ToBoolean(Convert.ToInt32(decode));
        }
        catch
        {
          tmpBool = false;
        }
      }

      // If url is encoded, decode it
      if (tmpBool)
      {
        url = UrlProvider.DecodeUrl(url);
      }
      RequestInfo.RequestUrl = url;
    }

    tmpBool = false;

    // Get request post method state
    string postForm = httpRequest.QueryString[Consts.qIsPostForm];
    if (postForm != null && postForm != "")
    {
      try
      {
        tmpBool = Convert.ToBoolean(Convert.ToInt32(postForm));
      }
      catch
      {
        tmpBool = false;
      }
    }

    // if request is post method set the options
    if (tmpBool)
      RequestInfo.RequestInQueryMethod = WebRequestMethod.POST;
    else
      RequestInfo.RequestInQueryMethod = WebRequestMethod.GET;
  }
}

در زیر نحوه پیاده سازی تابع PreExecution را مشاهده می کنید. وظیفه اصلی این تابع انجام درخواست است ولی هیچ نتیجه ای را بر نمی گرداند. این برای زمانی مهم خواهد بود بخواهیم بر روی هدر های پاسخ (Response Headers) بررسی هایی انجام دهید و در صورت نیاز برای ادامه تابع Execute را فراخوانی کنیم.

به این نکته باید توجه داشته باشید که پس از اجرای PreExecution می توان بعدا Execute را فراخوانی کرد و یا Execute را بدون فراخوانی PreExecute فراخوانی کرد.

و اما کدها:

/// <summary>
/// Executes the request and gets the responses but don't process the results
/// </summary>
public void PreExecution()
{
  if (fAutoDetection)
  {
    // If this is an image request, we should provide orginal link as referer
    if (RequestInfo.ContentType == MimeContentType.image_gif 
    	|| RequestInfo.ContentType == MimeContentType.image_jpeg)
      this.fUseRequestUrlAsReferer = true;
  }

  // Data executin should be one time!
  if (fWebData == null)
  {
    do
    {
      // If this is auto recection request send request again to new location
      if (fWebData != null && fWebData.ResponseInfo.AutoRedirect)
      {
        Uri autoRedirectLocation = fWebData.ResponseInfo.AutoRedirectLocation;

        CookieCollection cookies = fWebData.ResponseInfo.Cookies;
        bool redirectIsInternal = fWebData.ResponseInfo.AutoRedirectIsInternal;
        RequestInfo.RequestUrl = autoRedirectLocation.ToString();

        fWebData.Dispose();
        fWebData = null;
        fWebData = new WebDataCore(RequestInfo.RequestUrl);

        // In auto redirection it previous writed cookies needed and we set it here!
        if (redirectIsInternal)
        {
          fWebData.RequestInfo.Cookies = cookies;
        }
      }
      else
        fWebData = new WebDataCore(RequestInfo.RequestUrl);

      fWebData.UseRequestUrlAsReferer = fUseRequestUrlAsReferer;
      fWebData.RequestInfo.RequestMethod = RequestInfo.RequestInQueryMethod;
      fWebData.RequestInfo.PostDataString = RequestInfo.PostedFormData;
      fWebData.RequestInfo.ContentType = RequestInfo.ContentTypeString;
      fWebData.RequestInfo.InputStream = RequestInfo.InputStream;
      fWebData.AcceptCookies = fOptions.AcceptCookies;
      fWebData.DisplayErrorPageAsResult = false;

      // Run the request
      fWebData.Execute();

      // If execution returned an error
      if (fWebData.Status == LastActivityStatus.Error)
      {
        this.fLastErrorMessage = fWebData.ErrorMessage;
        this.fLastStatus = LastActivityStatus.Error;
        this.fLastException = fWebData.LastException;
        return;
      }

    } while (fWebData.ResponseInfo.AutoRedirect);

    SetResponseInformation();
  }
}

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