<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Iran Developers Network &#187; ASP</title>
	<atom:link href="http://www.irandevelopers.com/category/programming/asp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.irandevelopers.com</link>
	<description>IDN بزرگترین مرجع توسعه دهندگان ایران - آموزش زبانهای برنامه نويسی</description>
	<lastBuildDate>Mon, 23 Aug 2010 08:51:43 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>آموزش گام به گام ASP</title>
		<link>http://www.irandevelopers.com/programming/aspstepbystep88061-1925/</link>
		<comments>http://www.irandevelopers.com/programming/aspstepbystep88061-1925/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 10:41:59 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1925</guid>
		<description><![CDATA[آموزش گام به گام ASP . ASP یا (Active Server Pages ) چیست؟ با گذشت سالهای متمادی، ما تغییرات مهمی را در موضوع اینترنت مشاهده می نماییم. ابتدا، اینترنت به منظور یک سرویس دهنده ارتباطات متوسط برای بخشهای دولتی و موسسات دانشگاهی بود. با پیدایش www، اینترنت یک محیط دوستانه چند رسانه ای شد. در [...]]]></description>
			<content:encoded><![CDATA[<p>آموزش گام به گام ASP<br />
.<br />
ASP یا (Active Server Pages ) چیست؟</p>
<p>با گذشت سالهای متمادی، ما تغییرات مهمی را در موضوع اینترنت مشاهده می نماییم. ابتدا، اینترنت به منظور یک سرویس دهنده ارتباطات متوسط برای بخشهای دولتی و موسسات دانشگاهی بود. با پیدایش www، اینترنت یک محیط دوستانه چند رسانه ای شد. در اصل سرویس دهنده اینترنت به عنوان یک مکان برای آدمهای با ذوق به منظور خلق صفحات خانگی بود. اما هر چه افراد بیشتری به اینترنت وارد شدند، اینترنت به یک منبع اطلاعاتی برای همه افراد تبدیل شد. وقتی تعداد افراد Online به یک محدوده بحرانی رسید، شرکتهایی که محصولات و خدمات را می فروختند شروع به فروش اینترنتی کردند.</p>
<p>این شرکتها هیچ حضور فیزیکی نداشتند، فقط یک حضور مجازی داشتند! برای مثال شما میتوانید از سایت Amazon.com کتاب بخرید، اما شما قادر نخواهید بود که کتابفروشی Amazon.com را در نزدیکی خود پیدا کنید.</p>
<p>همانگونه که اینترنت به صورت یک فروشگاه موفق شد، طراحی صفحات وب سایت ها هم تغییر پیدا کرد. در روزهای اولیه وب،HTML به منظور ایجاد صفحات وب ایستا استفاده می شد. اما امروزه، صفحات وب ایستا به سرعت در حال منسوخ شدن میباشند. تصور کنید اگر Amazon.com تنها از صفحات وب ایستا تشکیل شده بود! شما نمی توانستید فهرستهای کتاب جستجو کنید. شما نمی توانستید یک در خواست را به صورت Online صادر کنید، شما نمی توانستید توضیحات کاربران دیگر را بخوانید. این است دلیل یک سرمایه گذاری مطمئن که اگر Amazon.com از صفحات وب پویا (Active Server Pages)استفاده نمی کرد، نمی توانست کتابهای زیادی بفروشد.</p>
<p>شما میتوانید صفحات وب پویا را از راههای زیادی ایجاد نمایید. راه حل مایکروسافت برای ساختن صفحات وب پویا استفاده از Active Server Pages ها می باشد که بصورت مختصر بر آن ASPمی گویند.<br />
سایت های وب بزرگ زیادی از ASP به منظور سرویس دادن پویا به اسناد وب استفاده می کنند. برای مثال Buy.com, HotBot.com, Dell.com از ASP برای ساخت سایت های وب پویای محاوره ای خود استفاده کردند.<br />
Re: ASP چیست؟<br />
ASP شامل دوبخش می باشد:</p>
<p>۱- کدهای برنامه نویسی<br />
۲- کدهای HTML. کدهای برنامه نویسی میتوانند به وسیله تعدادی از زبانهای دست نویس (Scripting Language) نوشته شوند.</p>
<p>یک زبان دست نویس(Scripting Language) یک دستور زبان مخصوص است که برای اجرای دستورات بر روی کامپیوتر استفاده می شود.<br />
زبانهای اسکریپت نویسی دست نویس(Scripting Language) مربوط به وب که محبوب می باشند عبارتند از: VBScript و JavaScript. وقتی یک صفحه ASP درست می کنید، شما میتوانید از یکی از چهار زبان برنامه نویسی استفاده کنید.(شبیه به دستورات زبان Visual Basic)</p>
<p>تعریف زبانهای دست نویس</p>
<p>VBScript: معمولترین زبان برنامه نویسی تحت وب برای ASPمی باشد.<br />
JScript: شبیه به JavaScript میباشد.<br />
PerlScript: شبیه به زبان Perlمیباشد.<br />
Python: یک زبان اسکریپت نویسی قدرتمند می باشد که بطور معمول برای توسعه وب به کار می رود.<br />
حال، چطور یک سرویس دهنده وب تعیین می کند که سرویس گیرنده یک صفحه HTML ایستا را درخواست کرده است یا یک صفحه ASP را؟ سرویس دهنده وب بوسیله پسوند صفحه وب، این موضوع را تعیین می نماید. به همین دلیل است که وقتی شما یک صفحه ASP را ایجاد می کنید باید پسوند آن را .aspقرار دهید. با این کار سرویس دهنده وب می فهمد که قبل از فرستادن خروجی برای سرویس گیرنده باید کد برنامه نویسی را پردازش نماید.<br />
اجازه دهید به صورت مختصر به یک صفحه ASP نمونه نگاهی بیندازیم. کد زیر شامل کدهایی می باشد که زمان و وقت فعلی را نمایش میدهند. برای اجرای کد شما در ابتدا نیاز به یک خدمات دهنده وب بر روی کامپیوترتان دارید. در این مورد در قسمت اجرای صفحات ASP بحث خواهیم نمود. در حال حاضر کد زیر را به منظور این ببینید که یک صفحه ASPچگونه بنظر میرسد اجرا نمایید.</p>
<p>کد:<br />
&lt;%&#8221;@Language=&#8221;VBScript %&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
The current time is:<br />
&lt;% ()Response.Write Time%&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>توجه کنید که کد ASP بوسیله علامت &lt;% %&gt; احاطه شده است. وقتی یک صفحه ASP از یک سرویس دهنده وب درخواست می گردد، سرویس دهنده وب به طور کامل همه کدهای مابین علامت &lt;% %&gt; را قبل از فرستان خروجی برای سرویس گیرنده پردازش می کند. کد بالا ممکن است شباهت زیادی به فایل HTML واقعی داشته باشد. در حقیقت، تنها کد ASP خطوط ۱و ۵ می باشد. خط ۱ به سرویس دهنده وب اطلاع میدهد که زبان Scripting در این صفحه ASP بکار رفته است. آن هم از نوع VBScript. به خاطر بیاورید که یک صفحه ASP می تواند از یکی از چهار زبان اصلی اسکریپت نویسی استفاده نماید.برای تعیین کردن یک زبان اسکریپت نویسی، برای یک صفحه ASP، شما از فرمان Language @ استفاده می کنید. اگر می خواستید از JScript بجای VBScript در مثال بالا استفاده کنید، باید خط اول کد بالا را بصورت زیر بنویسید:</p>
<p>کد:<br />
&lt;% &#8220;Language= &#8220;Jscript@ %&gt;</p>
<p>خط دوم از کد بالا وقت و زمان فعلی را نشان میدهند. تابع ( ) Time یک تابع VBScript می باشد .قسمت Response.Write نتایج حاصل از تابع ( ) Time را به سرویس گیرنده به عنوان خروجی می فرستد.</p>
<p>اگر یک سرویس دهنده وب مابکروسافت بر روی کامپیوترتان دارید، میتوانید کدهای بالا را آزمایش نمایید. یک فایل با نام current-time.asp ایجاد کرده و آنرا در دایرکتوری ریشه سایت وب(wwwroot) خود قرار دهید. سپس ،مرورگر مورد علاقه خود را باز کرده و صفحه ASP را ببینید.<br />
URLی که شما باید تایپ کنید به صورت زیر است:</p>
<p>کد:</p>
<p>http://localhost/current-time.asp</p>
<p>خروجی:</p>
<p>کد:<br />
The current time is: 10.26.57 AM<br />
فرق ASP با Client Side Scripting<br />
مهم است بدانید که کدهای ASP فقط بر روی سرویس دهنده وجود دارند.کد ASP ، که به وسیله محدود کننده های &lt;% , %&gt; محصور می شوند به وسیله سرویس دهنده به صورت کامل پردازش میگردند . سرویس گیرنده به این کدهای ASP دسترسی ندارد.</p>
<p>Client side scripting کدهای برنامه نویسی ای است که در یک فایل HTML بر روی مرورگر اجرا می گردد.<br />
کدهای اسکریپت نویسی Client Side شبیه کدهای HTML می باشند و به وسیله تگ HTML &lt;Script&gt; فهمیده می شوند.<br />
مقایسه بین صفحات HTML و ASP<br />
مشاهده یک صفحه وب به این صورت است که وقتی شما یک آدرس رو در نوار آدرس مرورگر خودتون تایپ می کنید مثلا : http://www.yahoo.com مرورگر یک درخواست به سرور می فرستد . سرور به درخواست مرورگر شما پاسخ می دهد و سند درخواستی شما رو برمی گرداند ( البته این بین DNS ها آدرس IP دامین سایت رو پیدا و مشخص می کنند + یک سری کارهای دیگر که به این مسائل کاری نداریم ) . اگر این سند یک فایل قابل نمایش برای مرورگر باشد ، کد اون فایل توسط مرورگر ترجمه می شود و شما اطلاعات فایل رو می بینید . اگر هم قابل نمایش نباشد برنامه مرورگر سعی در بارگذاری ( دانلود ) اون فایل می کند . با یک مثال معنی این حرف ها رو روشن می کنم .<br />
فرض کنید شما آدرس زیر رو در مرورگر خودتون تایپ کنید :</p>
<p>http://www.microrayaneh.com/Articles/ArticlesList.htm</p>
<p>این درخواست یک فایل از نوع HTML است . HTML مخفف Hyper Text Markup Language به معنی زبان نشانه گذاری ابرمتن است . اگر چنین فایلی روی سرور سایت وجود داشته باشد . مرورگر کد فایل رو ترجمه می کند و شما صفحه somepage.htm رو می بینید . برای دستیابی به کد یک صفحه از نوعHTML در اینترنت اکسپلورر می تونید از منوی View گزینه Source رو انتخاب کنید . این کد چیزی شبیه به کدهای زیر خواهد بود :</p>
<p>کد:<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=windows-1252&#8243;&gt;<br />
&lt;title&gt;Page Title&lt;/title&gt;<br />
&lt;/head&gt;</p>
<p>&lt;body&gt;<br />
&#8230;&#8230;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>نمونه سورس یک فایل HTML . به جای نقطه چین ها عناصری قرار می گیرد که باید در صفحه نمایش داده شود.اما فرض کنید فایل HTML ای که شما درخواست کرده اید روی سرور سایت وجود نداشته باشد . در این صورت شما یک پیغام خطا دریافت خواهید کرد ( خظای ۴۰۴ ) مبنی بر این که مرورگر موفق نشده است فایل مورد نظر شما را پیدا کند حالا فرض کنیم شما در نوار آدرس مرورگر خودتون آدرس یک فایل رو تایپ کنید که قابل نمایش نیست . مثل فایل های exe یا zip یا mp3 و &#8230; . در این صورت برنامه مرورگر سعی می کند فایل مورد نظر رو دانلود کند.<br />
اما بالاخره فرق یک صفحه ASP با یک صفحه HTML در چیست ؟</p>
<p>صفحات HTML استاتیک هستند یعنی به صورت پویا تغییر نمی کنند ، اگر بخواهید یک صفحه HTML چیزی غیر از آنچه که در حال حاضر نمایش می دهد رو نشان بدهد چاره ای جز دست بردن در سورس صفحه نیست .<br />
اما یک صفحه ASP به دلیل اینکه مجموعه ای از اسکریپت ها و کدهای HTML هست این قابلیت را دارد که به صورت خودکار و بر اساس شرایط محتوای مختلفی رو نمایش بدهد . همیشه برای اینکه کاربرد صفحات ASP در ساخت سایت های دینامیک مشخص شود از مثال مسابقات فوتبال استفاده می کنم .</p>
<p>فرض کنیم از شما خواسته شود که یک صفحه طراحی کنید برای نمایش جدول مسابقات لیگ برتر کشور .<br />
خوب اگر شما به صورت عادی و با استفاده از جدول های HTML کار رو پیاده سازی کنید مجبور هستید هر بار که مسابقه ای انجام می شود ، خودتون بررسی کنید که جایگاه هر تیم چه تغییری می کند ، امتیازات و تفاضل گل و بقیه چیزها رو هم خودتون حساب کنید و بعد بر اساس اون صفحه رو یک بار دیگر طراحی کنید . این بار با یک جدول که بر اساس اطلاعات جدید طراحی شده است . این یک کار وقت گیر و بیهوده است . تازه امکان اشتباه هم کم نیست . اما حالا اگر فرض کنیم که این پروژه رو با ASP پیاده سازی کرده باشیم . بر این اساس فقط باید یک سرویس طراحی کنیم که یک نفر نتیجه هر مسابقه رو وارد کند. نتایج برای پردازش به سرور فرستاده می شود ، بعد از پردازش بر اساس اسکریپت هایی که داخل صفحه هست ، جدول به روز می شود.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/aspstepbystep88061-1925/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>۷ دلیل برتری PHP نسبت به ASP</title>
		<link>http://www.irandevelopers.com/programming/7resionforphpbeterasasp88061-1928/</link>
		<comments>http://www.irandevelopers.com/programming/7resionforphpbeterasasp88061-1928/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 10:53:25 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1928</guid>
		<description><![CDATA[۷ دلیل برتری PHP نسبت به ASP دوستان ۷ دلیل برتری PHP نسبت ASP را در این مقاله بررسی میکنیم و در ادامه سعی میکنم هر هفته حداقل ۱ مقاله در مورد PHP براتون میزارم. امیدوارم کمکی در جهت بالا بردن سطح علمی دوستان و آشنا شدن آنها با PHP باشه. ۱- سرعت ، سرعت [...]]]></description>
			<content:encoded><![CDATA[<p>۷ دلیل برتری PHP نسبت به ASP<br />
دوستان ۷ دلیل برتری PHP نسبت ASP را در این مقاله بررسی میکنیم و در ادامه سعی میکنم هر هفته حداقل ۱ مقاله در مورد PHP براتون میزارم. امیدوارم کمکی در جهت بالا بردن سطح علمی دوستان و آشنا شدن آنها با PHP باشه.</p>
<p>۱- سرعت ، سرعت ، سرعتاولین باری که یک کد به زبان PHP نوشتم بر روی یک کامپیوتر Pentium 166Mhz بود بر روی سیستم عامل Linux و بههمراه Apache Web Server . بسیار برایم جالب بود که چقدر کد های من سریع اجرا می شوند . یعنی در آن موقع بااگر شما یک Windows NT بر روی آن می توانستید سوار کنید و به فرض که IIS هم بر روی آن بالا می آمد فکر کنماصلا وقت Serve کردن صفحات عادی html را نداشت چه برسد به اینکه بخواهد ASP را هم اجرا کند . علتش این استکه Microsoft از یک Technology در اجرا کردن کدهای زبان ASP استفاده می کند که در آن هر موقع شما تصمیم بهاستفاده از یک عنصر خارجی مانند VBScript, MSSQL, ODBC و خیلی چیزهای دیگر که در حقیقت از Engine هایخارجی استفاده می کنند دستور به آن Engine خارجی می دهد و جواب بدست آمده را بررسی و برای استفاده در اختیارادامه برنامه می گذارد . همین رفت و برگشت و اجرا کردن Engine های خارجی باعث کند شدن سرویس دهی می شود کهاین را شما به خوبی می توانید در استفاده از MSSQL به طرق مختلف احساس کنید . مثلا اگر شما خود MSSQL Extentions<br />
برای استفاده از MSSQL استفاده کنید برای یک Query مشترک ۱.۸۸ ثانیه زمان تلف می شود و اگر همان را با استفادهاز ODBC اجرا نماﺋید زمانی در حدود ۹.۵۴ ثانیه تلف می شود که این خود نشان می دهد که ASP اینها را به تنهاﺋی اجراءنمی کند و از Engine های ویندوز استفاده می کند .</p>
<p>۲- استفاده بهینه از Memory<br />
در IIS4 اگر شما در یک صفحه مثلا ۲۰ بار یک صفحه را Include کنید این صفحه ۲۰ بار در حافظه بارگذاری می شود و درحقیقت حافظه شما ۲۰ برابر زیادتر اشغال می شود . البته شنیدم که این مشکل در ویندوز ۲۰۰۰ و IIS5 حل شده استاما بازهم برای کسانی که ASP را مینویسند و می خواهند آنرا بر روی سرور های Hosting که دارای سیستم عامل NT<br />
هستند اجرا کنند مشکل زا است و باعث کند شدن سیستم می شود و در Load بالا مسلما مشکل زا خواهد شد .<br />
این مشکل به طور کلی در PHP وجود نداشته و ندارد و استفاده درست از Memory در هنگام اجرای یک کد باعث شده استکه صفحات در Load بالا نیز به خوبی قابل رٶیت باشند .</p>
<p>۳- خرج اضافی ندارید !<br />
مثلا در ASP اگر بخواهید از امکاناتی نظیر Encryption یا File Uploading یا ارسال نامه توسط کد برنامه استفاده کنیدباید امکانات اضافی برای این کار خریداری کنید و نصب کنید تا این امکانات به IIS شما اضافه گردد . این در حالیست کهدر PHP همه اینها در هنگام Compile در نظر گرفته می شوند و همگی از امکانات Standard این زبان هستند و هیچ نصبیا خرج اضافی در کار نیست .</p>
<p>۴- MySQL بهترین انتخاب، بیشترین سرعتدر اینجا قصد ندارد به مقایسه MySQL و MSSQL بپردازم . اما به خاطر قدرت خارق العاده MySQL و سازگار بودن این<br />
DBMS با زبان PHP به صورتیکه PHP اتصال به MySQL را به صورت دستورات Internally پشتیبانی می کند و حتی نیازبه نصب Module اضافی برای این کار نمی باشد ، از سرعت بسیار بالاﺋی در کار با SQL برخوردار است که شاید بعدا درمورد MySQL مقاله ای نوشتم .</p>
<p>۵- نزدیک بودن Syntax به ++C/C و Java<br />
از آنجاﺋیکه اکثر برنامه نویسان از ++C/C استفاده کرده اند و بخاطر محبوب بودن بی حد Java معمولا با Syntax هایاین دو زبان اکثرا آشنا هستند . PHP هم اکثر Syntax های خود را شبیه به این زبانها انتخاب کرده است که برای یادگیریدوباره Syntax دستورات دچار مشکل نشوید که مسلما Microsoft اصلا برایش این مساﺋل مشکل حساب نمی شود .</p>
<p>۶- رفع ایرادات ، سریع ، بی دردسرتا حالا از Microsoft خواسته اید که ایرادی را در سیستمهای خود رفع کند ؟ مسلما اگر شرکت بزرگی مانند Boeing<br />
نباشید حرف شما خیلی خریدار ندارد یا لااقل به این زودی ها به نتیجه نمی رسید .<br />
OpenSource بودن PHP این امکان را به شما می دهد که شخصا اقدام به رفع مشکل کنید و آنرا برای دستندرکاران PHP<br />
ارسال کنید و یا اینکه در Mailing List های عمومی PHP موضوع را مطرح کنید و خواهید دید که از سراسر دنیا برایرفع ایراد شما Patch ارسال می گردد .</p>
<p>۷- اجرا بر روی Platform های مختلفدرست است که خیلی از این ایرادات را Microsoft رفع خواهد کرد و Technology های جدیدتر اراﺋه خواهد کرد ( چهبسا این Net. که الان آمده همه را درست کرده باشد ) اما یک مشکل اساسی برای ASP وجود دارد و آن این است که<br />
ASP بدون Windows یعنی هیچ ! بدلیل اینکه ASP نصفی از کدها را توسط Engine های ویندوز اجرا می کند که درسیستم عامل های دیگر خبری از آنها نیست . لذا ASP در سیستم عاملهای دیگر همیشه دارای ضعفهای بزرگی است .<br />
اما PHP به دلیل آنکه توسط GNU C Compiler در همه Platform ها قابل Compile شدن است و از Engine های خاصهیچ سیستم عاملی برای اجرای کدها استفاده نمی کند قابلیت اجرا بر روی تعدا زیادی از OS ها را داراست که این یکمزیت برای برنامه نویس ها محسوب می شود</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/7resionforphpbeterasasp88061-1928/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>آشنایی با ASP</title>
		<link>http://www.irandevelopers.com/programming/introasp88060-1912/</link>
		<comments>http://www.irandevelopers.com/programming/introasp88060-1912/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 11:15:12 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[آشنايي با ASP]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1912</guid>
		<description><![CDATA[مقدمه و معرفی در این دوره ی آموزشی ، فرض ما بر این است که شما دوستان با html و تا حدی هم اسکریپت نویسی (vbs و js) آشنا هستید و احتمالا صفحات وبی را هم طراحی نموده اید . قصد ما این است که شما را با تکنولوژی asp که کاربرد فراوانی در طراحی [...]]]></description>
			<content:encoded><![CDATA[<p>مقدمه و معرفی</p>
<p>در این دوره ی آموزشی ، فرض ما بر این است که شما دوستان با html و تا حدی هم اسکریپت نویسی (vbs و js) آشنا هستید و احتمالا صفحات وبی را هم طراحی نموده اید . قصد ما این است که شما را با تکنولوژی asp که کاربرد فراوانی در طراحی سایتها و صفحات حرفه ای تر دارد آشنا کنیم .<br />
پس از مطالعه ی این دوره شما میدانید ASP چیست چه کاربردی دارد و چگونه می توانید یک برنامه ی کاربردی (یک سایت) بنویسید که از این تکنولوژی استفاده می کند .</p>
<p>صفحات سرویس دهنده فعال(Active Srerver Pages) یک تکنولوژی در زمینه برنامه نویسی در سرویس دهنده ها می باشد که توسط شرکت مایکروسافت برای ایجاد صفحات HTLM پویا در اینترنت وشبکه های داخلی (interanet)طراحی شده است .</p>
<p>ASP  چیست ؟<br />
بر خلاف HTML ،  ASP یک زبان نیست ، یک برنامهُ کاربردی مثل FrontPage  یا Word‌ هم نیست ؛ بلکه ASP یک تکنولوژی برای ساخت صفحات وب پویا است .<br />
ASP بر این اساس بنا شده است که با  HTML برای ایجاد صفحات وب پویا استفاده شود. در حقیقت ASP‌ کدهای HTML را ایجاد می نماید.<br />
به طور کلی یک صفحهُ ASP‌ از سه قسمت زیر تشکیل میشود : (SomePage.asp)<br />
1) متون ساده ای که به طور مستقیم در صفحة نمایش نشان داده می شوند .<br />
۲) کد های  HTML که برای مرورگرچگونگی نمایش متن را تعیین می کنند. این کدها بین دو علامت &lt; &gt; قرار می گیرند و در سمت سرویس گیرنده اجرا می شوند و به آنها تگ گفته می شود .<br />
۳) معمولاً قسمتی هم کد ASP . این کدها بین دو علامت قرار می گیرند و در سمت سرویس دهنده اجرا می شوند .<br />
ویژگی های منحصر به فرد ASP که در یک HTML ساده نمی توان به آن دست یافت عبارتند از :<br />
· می توانید کدهایی بنویسید که در سرویس دهنده ی وب اجرا شود .<br />
· اشیائی دارد که با استفاده از آنها کارهای زیادی می توانید انجام دهید مثل Request ، Response و غیره که در قسمتهای بعدی آنها را شرح می دهیم .<br />
· می توان با استفاده از اشیاء اکتیوایکس قابلیتهای ASP را گسترش داد .<br />
· با استفاده از ASP می توانید اطلاعات مورد نظر خود را با پایگاه داده های مختلف (مثل Access یا SQL Server و &#8230; رد و بدل کنید)<br />
به طور کلی می توان گفت محدودیتی در این که چه کاری با ASP می توانید انجام بدهید ندارید و تقریبا هر سایت وبی که امروزه در اینترنت وجود دارد با ASP قابل انجام است .</p>
<p>کارهایی که ASP می تواند انجام دهد ولی HTML نمی تواند :<br />
۱٫ با بروز درآوردن (update) یک  فایل متنی یا محتویات یک پایگاه داده می توان صفحات وب رابدون نوشتن کد HTML ی ویرایش کرد .<br />
۲٫ ساختن صفحات وب در جهت علاقه کاربرد<br />
۳٫ اطلاعات را از فرمها دریافت و در یک پایگاه داده ذخیره نماید .<br />
۴٫ ساختن صفحات تبلیغاتی با استفاده از یک مجموعه اشکال گرافیکی مختلف .<br />
۵٫ یک شمارنده صفحه ایجاد نماید .<br />
۶٫ گرفتن ورودی از کاربر ، و برگرداندن اطلاعات به همان کاربر با توجه به اطلاعات دریافتی<br />
۷٫ و &#8230;.</p>
<p>تفاوت اصلی HTML محض با ASP در اینست که HTML روی مرورگر تفسیر یا ترجمه می شود و روی سرویس دهنده اجرا نمی شود ، در حالیکه ASP روی سرویس دهنده اجرا می شود و حسن آن در اینجاست که با نوشتن کدی که روی سرویس دهندهُ وب اجرا می شود ، به امکانات بیشتری دست خواهید یافت .<br />
در درس بعد با سرویس دهنده ی وب آشنا می شوید .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/introasp88060-1912/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>کارکردن با رشته‌ها و متن‌ها در ASP.NET</title>
		<link>http://www.irandevelopers.com/programming/stringsinaspnet880115-1819/</link>
		<comments>http://www.irandevelopers.com/programming/stringsinaspnet880115-1819/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 17:39:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1819</guid>
		<description><![CDATA[اغلب متن‎هایی که کاربران یک سایت توسط فرم‌ها ارسال می‌کنند و یا اطلاعاتی که از یک بانک دریافت می‌شود، نیاز به بررسی و یا اعمال تغییرات دارند. در این مقاله با برخی توابع و امکانات ASP.NET برای کارکردن با رشته‎ها یا به تعبیری دیگر string‎ها آشنا می شویم.]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">اغلب متن‎هایی که کاربران یک سایت توسط فرم‌ها ارسال  می‌کنند و یا اطلاعاتی که از یک بانک دریافت می‌شود، نیاز به بررسی و یا اعمال  تغییرات دارند. در این مقاله با برخی توابع و امکانات ASP.NET برای کارکردن با  رشته‎ها یا به تعبیری دیگر string‎ها آشنا می شویم.</span> <!--<A href="#continue" mce_href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;></p>
<p class="text">اغلب متنهایی که کاربران یک سایت توسط فرم‌ها ارسال می‌کنند و یا  اطلاعاتی که از یک بانک دریافت می‌شود، نیاز به بررسی و یا اعمال تغییرات  دارد.</p>
<p>خوشبختانه ASP.NET مجموعه امکانات بسیار خوبی برای کارکردن با رشته‌ها  ارائه نموده است. بعبارت دیگر با استفاده از کلاس String برای ذخیره متون در  برنامه، امکانات زیادی را برای کار کردن با رشته‎های حرفی خواهیم داشت.</p>
<p>در  مثال‌های زیر سعی کرده‌ام مهمترین و پرمصرف‌ترین دستورات کار با رشته‌ها را معرفی  کنم.</p>
<p><strong>الف) انتخاب قسمتی از متن (mid)<br />
</strong><br />
دستور mid بر اساس  فرم زیر قابل استفاده است:</p>
<div class="EnglishParag">Mid(A, B, C)</p>
<p>A = متغیر متنی یا یک رشته  متن</p>
<p>B = شماره کارکتر شروع انتخاب</p>
<p>C = تعداد کارکتر انتخاب</p></div>
<div class="MultiLineCode">Dim aString As String = &#8220;SomeString&#8221;<br />
Dim bString As  String<br />
bString = Mid(aString, 3, 3) &#8216; Returns  &#8220;meS&#8221;<br />
Response.Write(bString)</div>
<p class="text"><strong>ب) انتقال بخشی از یک متن به داخل یک متغیر<br />
</strong><br />
Substring  بر اساس روش زیر قابل استفاده می باشد:</p>
<div class="EnglishParag">نام متغیر رشته‌ای.Substring(A, B)</p>
<p>A = شماره  کارکتر شروع انتخاب</p>
<p>B = تعداد کارکتر انتخاب</p></div>
<div class="MultiLineCode">Dim aString As String = &#8220;A String&#8221;<br />
Dim bString As  String<br />
bString = aString.Substring(2, 6) &#8216; Returns  &#8220;String&#8221;<br />
Response.Write(bString)</div>
<p class="text"><strong>ج) جمع نمودن چند رشته با یکدیگر<br />
</strong><br />
String.Concat  می‌تواند چند رشته را در کنار هم قرار دهد و یا مجموع اطلاعات یک آرایه را با هم  ادغام نماید.</p>
<div class="MultiLineCode">Dim myString As String<br />
Dim aString(10) As  String<br />
Dim t As Integer<br />
For t = 0 To 9<br />
aString(t) = CStr(t)<br />
Next  t</p>
<p>myString = String.Concat(aString) &#8216; Returns  &#8220;0123456789&#8243;<br />
Response.Write(myString)</p></div>
<p class="text"><strong>د) ادغام رشته‌ها به همراه قرار دادن کارکتر جدا  کننده<br />
</strong><br />
String.Join این امکان را فراهم می‌کند تا ضمن ادغام چند رشته، در  بین اطلاعات کاراکتر جداکننده نیز قرار دهیم.</p>
<div class="MultiLineCode">Dim shoppingItem(2) As String<br />
Dim shoppingList As  String<br />
shoppingItem(0) = &#8220;Milk&#8221;<br />
shoppingItem(1) =  &#8220;Eggs&#8221;<br />
shoppingItem(2) = &#8220;Bread&#8221;<br />
shoppingList = String.Join(&#8220;,&#8221;,  shoppingItem) &#8216;Returns &#8220;Milk,Eggs,Bread&#8221;<br />
Response.Write(shoppingList)</div>
<p class="text"><strong>ح) اضافه کردن متن جدید به یک رشته (Insert)<br />
</strong><br />
برای  اضافه کردن متن جدید به یک رشته کافی است از Insert به روش زیر استفاده نماییم:</p>
<div class="EnglishParag">متغیر رشته‌ای.Insert(A, B)</p>
<p>A = شماره کارکتری که  اضافه شدن از آن شروع می‌شود</p>
<p>B = متنی که می‌خواهیم اضافه کنیم</p></div>
<div class="MultiLineCode">Dim aString As String = &#8220;This is My Stng&#8221;<br />
Dim  myString As String<br />
myString = aString.Insert(13, &#8220;ri&#8221;) &#8216; Returns &#8220;This is My  String&#8221;<br />
Response.Write(myString)</div>
<p class="text"><strong>و) جدا نمودن یک رشته بر اساس یک کارکتر تکراری<br />
</strong><br />
گاهی  اوقات لازم است بر خلاف String.Join متن یک رشته را که به طور مثال با &#8220;،&#8221; به قطعات  مشخص تقسیم شده است را از هم جدا نماییم. برای این منظور همانند مثال زیر عمل  نمایید:</p>
<div class="MultiLineCode">Dim shoppingList As String = &#8220;Milk,Eggs,Bread&#8221;<br />
Dim  shoppingItem(2) As String<br />
shoppingItem = shoppingList.Split(&#8220;,&#8221;c)<br />
Dim s As  String<br />
For Each s In shoppingItem<br />
If s.Trim() &lt;&gt; &#8220;&#8221;  Then<br />
Response.Write(s &amp; &#8220;&lt;BR&gt;&#8221;)<br />
End If<br />
Next s</div>
<p class="text"><strong>ز) جایگزینی متن در رشته (Replace)<br />
</strong><br />
هرگاه نیاز به  تعویض و جایگزینی یک متن در یک رشته داشته باشیم می‌توانیم از Replace همانند مثال  استفاده کنیم:</p>
<div class="MultiLineCode">Dim myString As String = &#8220;Shopping List&#8221;<br />
Dim aString  As String<br />
aString = Replace(myString, &#8220;o&#8221;, &#8220;i&#8221;) &#8216; Returns &#8220;Shipping  List&#8221;.<br />
Response.Write(aString)</div>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/stringsinaspnet880115-1819/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>فایل Web.Config را بهتر بشناسیم</title>
		<link>http://www.irandevelopers.com/programming/aboutwebconfigfile880115-1817/</link>
		<comments>http://www.irandevelopers.com/programming/aboutwebconfigfile880115-1817/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 17:37:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1817</guid>
		<description><![CDATA[بیشتر برنامه‎های کامپیوتری تنظیمات خاص خود را در قالب مفهومی بنام Setup نگهداری می‎کنند. برنامه‎های ASP.NET هم از این قاعده مستثنی نیستند و می‎توان کلیه تنظیمات وب سایت را در قالب یک فایل از جنس XML بنام Web.Config نگهداری کرد.]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">بیشتر برنامه‎های کامپیوتری تنظیمات خاص خود را در قالب  مفهومی بنام Setup نگهداری می‎کنند. برنامه‎های ASP.NET هم از این قاعده مستثنی  نیستند و می‎توان کلیه تنظیمات وب سایت را در قالب یک فایل از جنس XML بنام  Web.Config نگهداری کرد.</span> <!--<A href="#continue" mce_href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;></p>
<p class="text"><strong>مقدمه<br />
</strong><br />
بیشتر برنامه های کاربردی کامپیوتری دارای بخشی  به نام Setup هستند که برای انجام تنظیمات متناسب با استفاده های مختلف کاربران  مورد استفاده قرار می گیرد. برنامه های کاربردی مبتنی بر Web نیز که دارای کاربران  زیادی هستند از این قائده مستثنی نیستند و احتیاج به انجام تنظیماتی متناسب با  کاربردهای مختلف خود دارند.</p>
<p>در ASP.NET اینگونه تنظیمات که مربوط به منابع  مورد استفاده برنامه کاربردی، اطلاعات محلی، اطلاعات امنیتی و&#8230; می شوند در داخل  یک فایل XML ذخیره می شوند که نام آن Web.Config است و طبعا به مانند اسناد XML  شامل تعدادی تگ (معادل Tag در HTML) است و به کوچک و بزرگ بودن حروف نیز حساس است  (Case Sensitive).</p>
<p>در این مقاله به اختصار به توضیح در مورد تگهای مهم این  فایل و چگونگی تنظیم خصوصیات مهم این تگها و کاربردهای آنها می پردازیم. پیش از  ادامه مطلب این نکته را متذکر می شویم که این فایل شامل تعداد زیادی تگ با خصوصیات  مختلف است که هر یک به جنبه ای از یک برنامه کاربردی تحت Web مربوط هستند. در این  مقاله در مورد تگهای پرکاربرد و مهم این فایل و خصوصیات مهم آنها اطلاعاتی ارائه  شده است برای به دست آوردن اطلاعات بیشتر در مورد هر یک از تگها و خواص آنها باید  به منابع تخصصی مرتبط با هر بخش رجوع کرد.</p>
<p><strong>محل و محدوده عملکرد فایل  Web.Config<br />
</strong><br />
به طور طبیعی هر برنامه کاربردی Web در ASP.NET دارای حداقل  یک فایل Web.Config در داخل دایرکتوری ریشه خود می باشد که به طور خودکار توسط  Visual Studio .NET در زمان ایجاد این Web Application ایجاد شده و با مقادیر پیش  فرض در دایرکتوری ریشه برنامه کاربردی قرار می گیرد. ولی برنامه نویسان می توانند  بر حسب نیازها و کاربردهای برنامه های خود تعداد بیشتری از این فایل XML را در داخل  دایرکتوریهای مختلف برنامه ایجاد کنند و برای تنظیمات فایلهای داخل همان دایرکتوری  یا زیر دایرکتوریهای آن به کار گیرند.</p>
<p>تنظیمات هر فایل Web.Config به  فایلهای داخل زیر دایرکتوری‎ای که در آن قرار دارد و همچنین زیر دایرکتوریهای آن  اعمال می شود. همچنین برنامه نویس می تواند از طریق کدهای داخل هر فایل Web.Config  منابع و دایرکتوریهای مورد نظر را تغییر دهد. برای درک بهتر نحوه ارتباط فایلهای  Web.Config در یک برنامه کاربردی Web، مثال زیر را بیان می کنیم.</p>
<p>اگر یک  دایرکتوری به نام main و دو زیر دایرکتوری به نام Sub1 و Sub2 در برنامه کاربردی  موجود باشند که در درون هر کدام از این دایرکتوریها یک فایل Web.Config قرار داشته  باشد تنظیمات هر فایل Web.Config بر فایلهای داخل زیر دایرکتوری آن اعمال می شود  اما اگر در یک فایل Web.Config که داخل زیر دایرکتوری Sub1 یا Sub2 قرار دارد یکی  از تنظیماتی که در فایل Web.Config که داخل main قرار دارد صورت نگرفته باشد مقدار  تنظیم شده در داخل فایل موجود در main به زیردایرکتوریها به ارث می  رسد.</p>
<p>نکته ای که باید در اینجا به آن اشاره کرد این است که کاربران برنامه  وب به محتوای فایلهای Web.Config دسترسی ندارند.</p>
<p><strong>ساختار فایل  Web.Config<br />
</strong><br />
هر فایل Web.Config شامل یک بخش پایه است که همان دو تگ  &lt;configuration&gt; و&lt;configuration/&gt; هستند و بقیه محتوا درون این دو تگ  قرار می گیرد. پس ساختار کلی هر فایل Web.Config به صورت زیر است:</p>
<div class="MultiLineCode">&lt;configuration&gt;<br />
&lt;!&#8211;Some  Configurations&#8211;&gt;<br />
&lt;/configuration&gt;</div>
<p class="text">محتوای هر فایل Web.Config شامل دو بخش اساسی است: معرفی و تنظیمات.  بخش معرفی داخل دو تگ &lt;configsectons&gt; و &lt;configsections/&gt; قرار می  گیرد و بخش تنظیمات، تنظیمات مربوط به منابع معرفی شده در این تگها را شامل می  شود.</p>
<p>ابتدای فایل Web.Config و بعد از تگ &lt;configuration&gt; تگ  &lt;configsections&gt; قرار دارد. داخل این تگ و تگ جفت آن یعنی  &lt;configsectons/&gt; تگهایی جهت معرفی منابع و اداره کننده قسمتها قرار دارد.  حال که با ساختار کلی فایل Web.Config آشنا شدیم در ادامه به توضیحاتی در مورد  تگهای مهم این فایل و خصوصیات آنها می  پردازیم.</p>
<p><strong>Location<br />
</strong><br />
پیشتر اشاره شد که تنظیمات هر فایل  Web.Config بر فایلهای داخل ریشه این فایل و زیردایرکتوری های آن اعمال می شوند،  حال اگر بخواهیم تنظیمات یک فایل Web.Config را بر دایرکتوری خاصی اعمال کنیم تنها  لازم است این تنظیمات را داخل یک جفت تگ &lt;location&gt; و &lt;location/&gt; قرار  دهیم یعنی شکل کلی استفاده از این جفت تگ به صورت زیر است:</p>
<div class="MultiLineCode">&lt;location  path=&#8221;url&#8221;&gt;<br />
&lt;!&#8211;Configurations&#8211;&gt;<br />
&lt;/location&gt;</div>
<p class="text"><strong>اطلاعات محلی<br />
</strong><br />
از تگ &lt;globalization&gt; برای تعریف  خصوصیات فرهنگی و زبانی برنامه کاربردی استفاده می شود. خواص مهم این تگ عبارتند  از:</p>
<p>• culture: فرهنگ برنامه کاربردی را تعیین می کند.<br />
•  requestencoding: شکل رشته های درخواست شده را تعیین می کند (برای مثال  Unicode).<br />
• responseencoding: شکل رشته های پاسخ را تعیین می کند.</p>
<p><strong>تگهای امنیتی<br />
</strong><br />
درون فایل Web.Config تگهایی جهت تنظیم  مقادیر و خصوصیات امنیتی برنامه کاربردی قابل تعریف هستند. جفت تگهای  &lt;authentication&gt; و&lt;authentication/&gt; و &lt;authorization&gt;  و&lt;authorization/&gt; ساختارامنیتی درون فایل Web.Config را می سازند که دارای  خصوصیات و مقادیر متفاوتی هستند که توضیح در مورد آنان به مباحث مقدماتی امنیت در  ASP. NET بر می گردد ولی در زیر توضیح کوتاهی از هر یک از این جفت تگها ارائه می  گردد.</p>
<p>تگ &lt;authentication&gt;: این جفت تگ به تعیین شکل تایید اعتبار در  برنامه کاربردی تحت Web می پردازد. از طریق خصوصیت mode که چهار مقدار Form  ،Passport ،Windows و None را می پذیرد می توان شکل تایید اعتبار را به ترتیب بر  مبنای ساختار امنیتی IIS، سرویس تایید اعتبار Passport شرکت مایکروسافت، استفاده از  cookieها و بدون استفاده از سیستم امنیتی تعیین کرد.</p>
<p>تگ  &lt;authorization&gt;: این جفت تگ برای تعیین کاربران واجد شرایط و یا فاقد شرایط  ورود به محدوده تحت کنترل فایل Web.Config استفاده می شود. با استفاده از دو تگ  &lt;allow&gt; و &lt;deny&gt; می توان کاربرانی که اجازه ورود به محدوده تحت حفاظت  را دارند و فاقد این اجازه هستند استفاده کرد.</p>
<p><strong>خطای زمان  اجرا<br />
</strong><br />
تگ &lt;customerrors&gt; جهت تعیین شکل عملکرد برنامه در زمان وقوع  یک خطای پیش بینی نشده در زمان درخواست یک صفحه توسط کاربر به کار می رود. این تگ  دارای دو صفت مهم است که در زیر توضیح داده شده اند.</p>
<p>• mode: این صفت جهت  تعیین نوع عملکرد برنامه کاربردی در مواجهه با خطا به کار می رود و یکی از سه مقدار  RemoteOnly ،On و Off را می گیرد. با تنظیم این صفت با مقدار RemoteOnly در صورت  بروز خطای زمان اجرا صفحه از پیش تعیین شده در قسمت defaultredirect برای کاربران  نشان داده خواهد شد ولی کاربرانی که بصورت محلی از برنامه استفاده می کنند (مقابل  سرور نشسته اند) صفحه خودکار ASP.NET و جزئیات خطا را خواهند دید. با تنظیم این صفت  با مقدار On در صورت بروز خطای زمان اجرا همواره صفحه از پیش تعیین شده در قسمت  defaultredirect نشان داده خواهد شد. با تنظیم این صفت با مقدار Off صفحه خطای  خودکار ASP. NET به نمایش در می آید که از لحاظ امنیتی گزینه مناسبی نیست.</p>
<p>•  defaultredirect: آدرس Url فایلی را که برای نمایش خطا در زمان تنظیم خصوصیت mode  با مقدار On یا RemoteOnly بکار می رود تعیین می کند.</p>
<p><strong>وضعیت جلسه  کاری<br />
</strong><br />
تگ &lt;sessionState&gt; برای تعیین وضعیت جلسه کاری مورد استفاده  قرار می گیرد و مدت زمان یک جلسه کاری و همچنین شکل تعیین درخواست کاربران را تعیین  می کند. از صفات مهم این تگ یکی Cookiless است که تعیین می کند جلسه کاری کاربران  از طریق Cookieها یا SessionID ها نسبت داده شوند که دو مقدار true یا false را می  گیرد: true برای استفاده از SessionID و false برای استفاده از Cookie.</p>
<p>خصیصه مهم دیگر این تگ mode است که یکی از چهار مقدار زیر را می  گیرد:</p>
<p>• Off: جلسه کاری غیر فعال<br />
• Inproc: اطلاعات به صورت In-process  ذخیره می شوند.<br />
• SQLServer: اطلاعات جلسه کاری توسط پایگاه داده SQL Server  مدیریت می شوند.<br />
• StateServer: اطلاعات توسط یک سرویس Out-Of-Process مدیریت  می شوند.</p>
<p>خصوصیت مهم دیگر این تگ timeout است که زمان اعتبار جلسه کاری هر  کاربر را بر حسب دقیقه تعیین می کند.</p>
<p><strong>کامپایل برنامه  کاربردی<br />
</strong><br />
تگ &lt;compilation&gt; برای تعیین خصوصیات مربوط به شکل  کامپایل برنامه کاربردی مورد استفاده قرار می گیرد که دو خصیصه مهم آن عبارتند  از:</p>
<p>• debug: یکی از دو مقدار true یا false را می گیرد (false پیش فرض است)  و تعیین می کند که اطلاعات اشکال زدایی در اسمبلی های بعد از کامپایل قرار بگیرند  یا خیر. با تنظیم این خصیصه با مقدار true این کار صورت می گیرد. و با تنظیم این  خصیصه با مقدار false این کار صورت نمی گیرد.<br />
• defaultlanguage: زبان برنامه  نویسی مورد استفاده جهت کامپایل برنامه کاربردی (به صورت Dynamic) را تعیین می کند.</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/aboutwebconfigfile880115-1817/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IrMail، روشی جدید برای ارسال نامه در ASP.NET (بخش دوم)</title>
		<link>http://www.irandevelopers.com/programming/aspnetirmailp2880115-1815/</link>
		<comments>http://www.irandevelopers.com/programming/aspnetirmailp2880115-1815/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 17:35:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1815</guid>
		<description><![CDATA[در قسمت قبل این مقاله به بررسی نیاز به شئ ‎ای برای ارسال نامه ها در برنامه های تحت وب پرداختیم. همچنین نگاهی داشتیم به روشها و امکانات موجود در این زمینه. نهایتا به اینجا رسیدیم که ابزارهای حاضر کامل نیستند و نیاز به تکمیل دارند. در صورتیکه قسمت قبل این مقاله را مطالعه نکرده [...]]]></description>
			<content:encoded><![CDATA[<p>در قسمت قبل این مقاله به  بررسی نیاز به شئ ‎ای برای ارسال نامه ها در برنامه های تحت وب پرداختیم. همچنین  نگاهی داشتیم به روشها و امکانات موجود در این زمینه. نهایتا به اینجا رسیدیم که  ابزارهای حاضر کامل نیستند و نیاز به تکمیل دارند. در صورتیکه قسمت قبل این مقاله  را مطالعه نکرده اید، پیشنهاد می شود قبل از ادامه به خواندن این قسمت، آنرا مطالعه  فرماید.</p>
<p>همانطور که اشاره شد، شئ IrMail شئ‎ای است برای ارسال نامه ها از  طریق برنامه های تحت دات نت. در زیر مزیت ها و توانایی های این شئ بررسی شده است تا  بتوان دیدی صحیح تر نسبت به آن پیدا کرد.</p>
<p><strong>مزیت های شئ  IrMail<br />
</strong></p>
<p><strong>امکان ارسال نامه با قابلیت  Authentication<br />
</strong><br />
همانطور که ذکر شد، شئ ذاتی NET. بدلیل سادگی آن، قابلیت  Authentication (شناسائی) را به ما نمی دهد. اما برخی اوقات سرویس دهنده های SMTP  ما را مجبور می کنند تا قبل از ارسال نامه، خود را معرفی (login) کرده و یا به  اصطلاح Authenticate شویم. در IrMail این مساله بخوبی پیاده سازی شده است. به صورتی  که با تنظیم دو خصیصه username و password عملیات Authentication به سادگی انجام می  شود.</p>
<p><strong>امکان ارسال نامه های فارسی بدون نگرانی از نحوه خوانده  شدن<br />
</strong><br />
این مورد نیز یکی از امکانات بالقوه این شئ می باشد که در نوع خود  تقریبا جدید و منحصر بفرد است. این ویژگی که تحت عنوان UTF8AnyWhere ذکر می شود،  باعث می شود نامه های شما در هر جایی که UTF8 را پشتیبانی می کند حتما به صورت  فارسی دیده شود. از آنجا که امروزه تقریبا تمام سیستم عامل ها از استاندارد یونیکد  پشتیبانی می کنند، عدم توانایی خواندن نامه های فارسی بسیار کم می شود. بطور واضح  آنکه به همان اطمینانی که شما سایت خود را بصورت یونیکد طراحی می کنید تا فارسی  دیده شدن آن تضمین شود، همین تضمین نیز برای درست خوانده شدن نامه های شما بوجود می  آید. به بیان ساده تر هرجا سایت شما فارسی دیده شود، این تضمین هست که نامه های شما  نیز فارسی دیده شود. نکته دیگر اینکه نامه های شما در هر نوع Encodingای که قرار  داده شده باشد، بازهم فارسی دیده می شود و لزومی نیست که حتما Encoding نامه بصورت  UTF8 باشد. بنابر آنچه گفته شد، نامه های شما چه در Hotmail، چه در Yahoo و چه در  هر سرویس دهنده دیگری حتما فارسی دیده می شود. استفاده از این ویژگی بسیار ساده است  و با True کردن property مربوطه، کلیه عملیات لازم برای این کار به صورت خودکار  انجام می شود.</p>
<p><strong>تضمین ارسال تمامی نامه ها حتی در صورت قطع بودن موقتی  سرویس دهنده SMTP<br />
</strong><br />
مشکل دیگری که کما بیش سایت های مختلف با آن مواجه  هستند، قطع شدن موقتی SMTP Server می باشد. مثال زیر را در نظر بگیرید. در بعضی  مواقع سرویس دهنده SMTP بنا به دلایل مختلفی برای مدتی (هرچند کوتاه) قطع می شود و  از آنجا که اکثر میزبانها برای یک خرابی جزیی خود را لازم به توضیح نمی بینند،  بنابراین شما از این وضعیت مطلع نخواهید شد و درنتیجه قادر نخواهید بود که اقدامی  را در این زمینه انجام دهید. البته همیشه هم تقصیر بر گردن میزبانها نیست و گاهی  خود سرور با مشکل مواجه می شود. شاید این مشکل در نگاه اول جدی به نظر نرسد. اما  اگر در همین زمان یک شرکت بزرگ قصد داشته باشد به شما پیشنهاد همکاری دهد و از طریق  صفحه &#8220;تماس با ما&#8221; و از طریق فرم تهیه شده در آن، قصد ارسال نامه ای به شما را  داشته باشد چه رخ خواهد داد؟ خوب عملا این نامه هرگز ارسال نخواهد شد و شاید شما یک  موقعیت استثنایی را به همین سادگی از دست بدهید!</p>
<p>در طراحی شئ IrMail این  مشکل عملا از بین رفته است. چرا که در صورت عدم امکان ارسال نامه توسط سرویس دهنده  SMTP در آن لحظه، نامه مذکور را ذخیره کرده و در تماس بعدی با سرویس دهنده SMTP،  (در صورت فعال بودن آن) سعی در ارسال مجدد نامه های ارسال نشده خواهد کرد. بدین  ترتیب حتی اگر SMTP Server برای مدت مدیدی هم قطع باشد، دیگر شما نگران از دست دادن  هیچ نامه ای نخواهید بود. این مورد برای تمام نامه هایی که از طریق این شئ ارسال و  یا دریافت می شوند صدق خواهد کرد. در طراحی این فرآیند، نکات زیر رعایت شده  است:</p>
<p>۱- فایل حاوی نامه های ذخیره شده از نوع XML می باشد. بنابراین حتی اگر  درآینده NET. بر روی سرور Linux و یا حتی هر سرور دیگری ارایه شد، با مشکل مواجه  نمی شود. چراکه XML یک استاندارد است که بر فایل های ساده متنی متکی است.</p>
<p>۲-  از آنجا که ظرف ذخیره سازی، یک فایل متنی ساده است، از مدیریت و کنترل دسترسی های  همزمان در آن خبری نیست. بدین معنی که اگر SMTP Server فعال نبود و در آن واحد دو  کاربر قصد ارسال نامه را داشتند، به احتمال زیاد منبع مورد نظر بهم می ریزد (Not  thread-safe). در اینجا نیز مشکل برطرف شد و این مدیریت با توجه به امکاناتی که  NET. در کنترل منابع همزمان فراهم کرده است ایجاد شده است ( برای اطلاعات بیشتر به  مقاله Threadها در ASP.NET  مراجعه کنید). بدین ترتیب دسترسی های همزمان مشابه آنچه در DBMS ها رخ می دهد،  امکان پذیر است.</p>
<p><strong>نمونه ای از نحوه استفاده از شئ  IrMail<br />
</strong><br />
از آنجا که این شئ در هر بار ایجاد نیاز به تنظیمات خاصی دارد  (مثلا Username ،Password، محل دخیره سازی نامه های ارسال نشده و&#8230;) که برای هر  سایت منحصربفرد است، پیشنهاد می شود که به صورت زیر عمل شود.</p>
<p>یک کلاس از  کلاس IrMail.Mail را به ارث برده و تنظیمات خاص خود را در سازنده (Constructor) آن  قرار دهید. در هنگام نیاز به ارسال نامه فقط کافی است یک نمونه از کلاس ارث بری شده  را ایجاد کنید (نمونه ای از این ارث بری در زیربه زبان VB.NET نشان داده شده  است).</p>
<div class="EnglishParag">Public Class MySmtpMail<br />
Inherits  IrMail.Mail</p>
<p>Public Sub  New()</p>
<p>MyBase.New(HttpContext.Current.Server.MapPath(&#8220;&#8221;) )</p></div>
<p>مقدار پارامتر سازنده کلاس IrMail.Mail محل مکانی را نشان می دهد که می خواهید  نامه های ارسال نشده در آنجا ذخیره شود. در این مثال محل دخیره سازی را برابر با  دایرکتوری ریشه سایت قرار دادیم . شما می توانید جهت امنیت بیشتر، این محل را تغییر  و به مکان دیگری منتقل کنید (بطور مثال دایرکتوری محل ذخیره DBها که معمولا fpdb می  باشد).</p>
<div class="EnglishParag">Me.SMTPserver = &#8220;YourSMTPServer&#8221;<br />
Me.PickUpDirectory =  &#8220;c:\inetpub\mailroot\pickup&#8221;</div>
<p>خصیصه فوق (PickUpDirectory) مورد نیاز SMTP Server می باشد.</p>
<div class="EnglishParag">Me.UserName = &#8220;YourUsername&#8221;<br />
Me.Password =  &#8220;YourPassword&#8221;</div>
<p>موارد فوق از آن جهت نیاز است که بتوانید نامه های ارسالی خود را از طریق سرویس  دهنده هایی که نیاز به Authentication دارند نیز ارسال نمائید. در صورتیکه سرویس  دهنده شما نیازی به Authentication ندارد، نیازی به تعیین نام کاربری و کلمه رمز  ندارید.</p>
<div class="EnglishParag">Me.UTF8AnyWhere = True</div>
<p>این خصیصه باعث می شود نامه شما در همه جا فارسی دیده شود. در صورتی که نامه شما  انگلیسی است، می توانید این خصیصه را false قرار دهید. مقدار پیش فرض آن نیز false  است.</p>
<div class="EnglishParag">Me.LoadSharedObject4WebApplication(HttpContext.Current)</div>
<p>استفاده از دستور فوق همیشه اجباری است و باید به همین صورت باشد. در صورتی که  دستور فوق ذکر نشود، مکن است شئ شما با مشکل مواجه گردد.</p>
<div class="EnglishParag">End Sub<br />
End Class</div>
<p>حال هرجا در سایت خود قصد داشتید که نامه ای را ارسال کنید، کافیست یک نمونه از  کلاس فوق را ساخته و سایر خصوصیات آنرا تنظیم نمایید. به عنوان مثال:</p>
<div class="MultiLineCode">Dim ObjMailer As New MySmtpMail ()<br />
ObjMailer.From =  &#8220;EveryOne@Server.Com&#8221;<br />
ObjMailer.To=  &#8220;EveryOne@AnotherServer.Com&#8221;<br />
ObjMailer.Subject = &#8220;New Email  Object&#8221;<br />
ObjMailer.Body= &#8220;The body of your mail in each  language&#8221;<br />
ObjMailer.Send()</div>
<p>و بدین ترتیب نسبت به ارسال نامه خود اقدام کنید. نمونه برنامه کامل را می  توانید از آدرس http://www27.brinkster.com/mahmoud690/irmail/sample.htm دریافت  کنید.</p>
<p>توجه: متد IrMailMail.Send دارای یک پارامتر اختیاری است که به صورت  پیش فرض true می باشد. اگر آنرا به false تنظیم کنید بدین معنی است که اگر smtp  server فعال نبود، لازم نیست آنرا ذخیره کند (غیر فعال کردن ویژگی آخر). این مورد  در مواردی کاربرد دارد که ارسال شدن یا نشدن نامه برای شما آنقدر اهمیت نداشته  باشد.</p>
<p><strong>نکته آخر: &#8230; مجانی به همراه کد! (Free And OpenSource)</strong></p>
<p>این شئ برای همه به صورت مجانی قابل دریافت و استفاده است. در ضمن کدهای  این کلاس به صورت مجانی نیز قابل دریافت است. این بدین معنی است که شما می توانید  کدها را مشاهده کرده و آنها را مطابق میل خودتان دستکاری و استفاده نمایید  (OpenSource). این شئ بر روی لیست اشیا مایکروسافت نیز ثبت شده است و امیدوار هستیم  این شئ به عنوان اولین شئ ایرانی که در این لیست ثبت شده باعث گردد دوستان دیگر نیز  نسبت به ثبت اشیا خود در آن اقدام کنند، چراکه این لیست به عنوان یک کاتالوگ معتبر  اشیا NET. در نزد برنامه نویسان مطرح است و مسلما وجود اشیا مختلف از برنامه نویسان  ایرانی و با نام ایران، اعتبار سایت و برنامه نویسان ایرانی را در نزد دیگران  افزایش خواهد داد.</p>
<p>نهایت آنکه اهداف من از Opensource قرار دادن کلاس فوق به  صورت زیر است:</p>
<p>- مسلما این شئ نه آنقدر کامل و بی عیب است و نه دانش من در  این زمینه به اندازه کافی کامل و تخصصی است که بخواهم آنرا بصورت تجاری ارایه دهم.  ضمن آنکه امکانات آنرا نیز ندارم.<br />
- با opensource قرار دادن آن، امکان کمک و  یاری گرفتن از سایر دوستان را نیز فراهم کرده ام. ضمن آنکه اینگونه برنامه ها  امتحان خود را پس می دهند.<br />
- و نهایت آنکه باز کردن کدهای NET. از روی فایل های  Exe یا Dll آنها بسیار ساده است!</p>
<p>بطور خلاصه آنکه این شئ متعلق به خود شماست  و از همینجا از تمامی دوستانی که در این زمینه فعالیت دارند درخواست دارم که با  استفاده از این شئ و یافتن نقاط ضعف و کاستی ها و کمبودهای آن من را در جهت تکمیل  آن یاری دهند. در مقابل هم تنها کاری که از دست من در برابر لطف این دوستان برمی  آید این است که نام آنها را به عنوان یکی از برنامه نویسان و یا debuggerهای آن ذکر  کنم.</p>
<p>آدرس سایت انگلیسی:<br />
<a href="../../www27.brinkster.com/mahmoud690/irmail">http://www27.brinkster.com/mahmoud690/irmail</a><br />
آدرس مستقیم Download شئ کامپایل شده:<br />
<a href="../../www27.brinkster.com/mahmoud690/irmail/downloadassembly.htm.htm">http://www27.brinkster.com/mahmoud690/irmail/downloadAssembly.htm.htm</a><br />
آدرس مستقیم Download کدهای برنامه:<br />
<a href="../../www27.brinkster.com/mahmoud690/irmail/download-source.htm">http://www27.brinkster.com/mahmoud690/irmail/Download-source.htm</a><br />
آدرس این شئ در کنترل گالری سایت رسمی ASP.NET:<br />
<a href="../../www.asp.net/controlgallery/controldetail.aspx@control=1918&amp;tabindex=2">http://www.asp.net/ControlGallery/ControlDetail.aspx?Control=1918&amp;tabindex=2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/aspnetirmailp2880115-1815/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IrMail، روشی جدید برای ارسال نامه در ASP.NET (بخش اول)</title>
		<link>http://www.irandevelopers.com/programming/aspnetirmailp1880114-1813/</link>
		<comments>http://www.irandevelopers.com/programming/aspnetirmailp1880114-1813/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 17:34:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1813</guid>
		<description><![CDATA[ارسال نامه از طریق سایت بصورت خودکار همواره برای برنامه نویسان وب موضوعی حساس و مهم بوده است. بسیاری از بخش های یک سایت حرفه‎ای مانند صفحه ارتباط با مدیر سایت، نامه‎های یادآوری کلمه رمز کاربران، ارسال خبرنامه و&#8230; همگی به نوعی از قابلیت ارسال نامه توسط یک برنامه بهره می برند. این مقاله به [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">ارسال نامه از طریق سایت بصورت خودکار همواره برای  برنامه نویسان وب موضوعی حساس و مهم بوده است. بسیاری از بخش های یک سایت حرفه‎ای  مانند صفحه ارتباط با مدیر سایت، نامه‎های یادآوری کلمه رمز کاربران، ارسال خبرنامه  و&#8230; همگی به نوعی از قابلیت ارسال نامه توسط یک برنامه بهره می برند. این مقاله به  معرفی یک شئ جدید بنام IrMail جهت ارسال نامه در ASP.NET با تاکید بر زبان فارسی می  پردازد.</span> <!--<A href="#continue" mce_href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;>تذکر ۱: هر جا در این مقاله کلمه &#8220;شئ IrMail&#8221; ذکر شود، منظور همان کامپوننت آن  (IrMail Component) است که به منظور رساندن مطلب، از این جایگزین استفاده شده  است.<br />
تذکر ۲: شئ IrMail صرفاً برای نسخه NET 1.1. (و به بعد) طراحی شده است.  برای نسخه NET. 1.0، با نویسنده مقاله تماس بگیرید.</p>
<p>مطلب را با طرح یک مساله  آغاز می کنیم و در ادامه آن به بررسی و یافتن راه حل های مختلف برای آن و مقایسه  آنها با هم می پردازیم.</p>
<p><strong>طرح مساله</strong></p>
<p>همانطور که می دانید  یکی از مسائلی که برنامه نویسان برنامه های تحت وب (web applications) با آن مواجه  هستند، مساله ارسال نامه از طریق سایت به صورت خودکار می باشد. دلایل نیاز به انجام  چنین کاری را می توان به صورت زیر خلاصه کرد:</p>
<p>• ایجاد صفحه &#8220;تماس با ما&#8221; و  امکان ارسال نامه از طریق سایت<br />
• نامه های حاوی اطلاعات کاربر برای تایید  عضویت<br />
• نامه های یادآوری Password کاربران<br />
• خبرنامه ها<br />
• و در کل هرگونه  نیاز به ارتباط با کاربر از طریق ایمیل به صورت پویا و  خودکار</p>
<p><strong>ASP.NET <span lang="fa"> </span>در مقابل ASP  کلاسیک</strong></p>
<p>اگرچه شئ CDONTS به شکل استفاده از یک شئ جنبی این مساله را در  ASP کلاسیک تا حدی حل کرده بود، اما کاربران ASP کلاسیک بصورت عمده با این مساله  مواجه بودند. این مساله به حدی مهم بود که یکی از مشخصه های اصلی انتخاب یک میزبان  (host) مناسب برای میزبانی سایت‎هایشان را همین موضوع در برمی گرفت. بطوریکه تا قبل  از تست امکانات آن و مطمئن شدن از آن اقدام به بستن قرارداد نمی کردند و یا در  نهایت اقدام به تعویض میزبان مورد نظر می کردند.</p>
<p>با پیدایش NET Framework.  عملاً این مشکل حل شد. چرا که:</p>
<p>• وجود شئ<span lang="fa">‎ </span>‎ای بصورت  ذاتی برای این کار<br />
• امکان ارث بری از کلاسها<br />
• و عدم نیاز به ثبت شدن اسمبلی  ها (Dll) در Registry</p>
<p>این مساله بسیاری از توانایی ها و امکانات را در دست  برنامه نویسان قرار داد تا حتی در صورت ناقص بودن کلاس های موجود در NET.، امکان  تکمیل و حتی ارایه یک کلاس جدید در این زمینه را داشته باشند.</p>
<p>در ASP  کلاسیک از آنجا که اشیاء باید در رجیستری ثبت گردند، عملاً این امکان را از بسیاری  از برنامه نویسان عادی سلب می کرد که خود بر روی اشیاء کار کنند و نمونه مورد نظر  را ایجاد و استفاده نمایند. دلیل این بود که اکثر میزبانها حاضر به رجیستر کردن شئ  شما نیستند و به این ترتیب انحصار کار بر روی این اشیاء برای یک سری شرکتها بدست  آمده بود.</p>
<p>اما در NET. با توجه به نکاتی که گفته شد این انحصار از بین رفت و  بسیاری از برنامه نویسان عادی نیز اقدام به تهیه اشیائی دراین زمینه کردند بطوریکه  در سایت رسمی ASP.NET نیز مکانی برای جمع آوری و معرفی اشیا معرفی شده توسط کاربران  فراهم آمد. این اشیا از طریق آدرس <a href="../../www.asp.net/controlgallery/default.aspx@tabindex=2" target="_blank">http://www.asp.net/ControlGallery/default.aspx?tabindex=2</a> قابل  مشاهده و حتی دریافت مجانی هستند.</p>
<p><strong>مشکلات شئ موجود در  NET.</strong></p>
<p>اما چه مساله‎ای باعث شد که برنامه نویسان NET. اقدام به تکمیل ویا  ایجاد شئ جدیدی در این زمینه کنند؟ همانگونه که راهنمای NET. بیان کرده است، در  حقیقت کلاس SmtpMail بصورت یک لفاف یا اصطلاحاً یک wrapper برای کلاس <span dir="ltr">Collaboration Data Objects for Windows 2000 (CDOSYS)</span> می باشد. در  واقع این لفاف تنها قابلیتهای ساده‎ای از این شئ قدرتمند را پشتیبانی کرده است و  بسیاری از امکانات آن در صورت استفاده از این لفاف دیگر قابل استفاه نیست. بعنوان  مثال هنگامی که سرویس دهنده SMTP شما نیاز به شناسائی (Authentication) دارد،  SmtpMail هیچ امکانی جهت تعیین نام کاربری و کلمه رمز به شما نمی دهد. همچنین شما  نمی توانید charset را برای نامه ارسالی خود در حالت HTML تعیین کنید. بعبارت دیگر  شئ SmtpMail بسیار ساده و ابتدائی است. ولی ما در برخی مواقع نیاز داریم که  قابلیتهای بیشتری از CDOSYS را در اختیار بگیریم و از آنها استفاده  کنیم.</p>
<p>توجه : در این مقاله به نحوه کار شئ موجود در NET Framework. پرداخته  نمی شود. مقاله های مربوط به کار با این شئ از همین سایت قابل دریافت  است.</p>
<p>همین دو مورد و بالاخص مورد اول بسیاری از برنامه نویسان را بر آن داشت  که به دنبال راهی برای رفع این مشکلات باشند. از جمله این تلاش ها مقاله ای است که قبلاً در همین سایت  انتشار یافته است. همان مقاله مرا بر آن داشت تا به تکمیل آن اقدام کرده و آنرا در  شکلی مناسب تر و قابل استفاده تر ارایه نمایم.</p>
<p>قبل از آنکه به بیان مزایا و  توانایی های شئ IrMail بپردازیم، ابتدا با اشاره ای کوتاه، یکی دیگر از معضلات  ارسال نامه را بررسی می کنیم.</p>
<p><strong>مشکل ارسال ایمیل به زبان های غیر  انگلیسی</strong></p>
<p>این مشکل نیز از جمله مشکلاتی است که گریبانگیر بسیاری از سایت  های غیر انگلیسی زبان است. مشکلی که قبل از آنکه به اشیا ارسال نامه مربوط باشد، به  عدم وجود استانداردهای لازم در این زمینه بر می گردد. استانداردهایی که هم مرورگرها  ملزم به پشتیبانی از آن باشند و هم سرویس دهندگان ایمیل (منظور آنکه این مشکل به  NET. ارتباطی ندارد).</p>
<p>در این مقاله به جای استفاده از کلمه &#8220;غیرانگیسی&#8221;، از  نمونه ای از زبانهای غیر انگلیسی که اینجا فارسی است استفاده می شود. توجه کنید  هرکجا که از زبان فارسی نام برده شد، منظور هر زبان غیرانگلیسی است که به عنوان  نمونه ای از آن مطرح می شود.</p>
<p>این مشکل از آنجا شروع شد که برخی از برنامه  نویسان قصد داشتند نامه های خود را به زبان فارسی ارسال کنند. برنامه نویسان بطور  عمده برای حل این مشکل سه راه حل را درپیش داشتند:</p>
<p>• ارسال نامه به زبان  انگلیسی<br />
• ارسال تصویری از متن فارسی<br />
• و یا نهایتا به صورت پینگلیش (برای  فارسی زبانان)!</p>
<p>در هر سه روش مورد استفاده، عملا مشکل به صورت کامل حل  نشد.</p>
<p>آنهایی که قصد ارسال نامه به زبان انگلیسی را داشتند با طیف گسترده  کاربران غیر انگلیسی زبان مواجه می شدند و این در حالی بود که نوشتن خود نامه به  زبان انگلیسی از دیگر مشکلات بود. در کل نیز ارسال نامه به زبانی غیر از زبان سایت  بی سنخیت است. مانند آنکه اداره شما در ایران باشد و کلیه روابط آن بر اساس زبان  فارسی و این در حالیکه کلیه مکاتبات شما به زبان انگلیسی صورت گیرد.</p>
<p>در روش  ارسال عکس متن، که دیگر کمتر مورد استفاده است، نیز به دلیل حجم بالای نامه و عدم  انعطاف پذیری آن (و این روزها وجود ویروس و &#8230;) برای سایت های رسمی و حتی کاربران  قابل قبول نیست. ضمن آنکه امکان ایجاد عکس های پویا که فرم مناسبی هم داشته باشند  کار سخت و طاقت فرسایی است.</p>
<p>در روش سوم اصل عمل مشکل دارد و بیشتر شبیه شوخی  است! شوخی ای که به دلیل عدم آشنایی کاربران به زبان انگلیسی و اینکه سرویس های  کامپیوتری بطور عمده به زبان انگلیسی است، به یک جدیت تلخ تبدیل شده است. به هر حال  استفاده از این روش برای سایتهایی که عملکرد آنها رسمی و جدی است بی معنی و نامناسب  است. این روش شاید تنها مورد استفاده سایت های فانتزی و غیر رسمی باشد.</p>
<p>در  این میان برخی نیز تصمیم گرفتند که نامه های خود را به زبان فارسی ارسال کنند و در  همان نامه به انگلیسی (یا پینگلیش!) نحوه خواندن نامه به فارسی را ذکر می کردند.  چراکه در اکثر مواقع اگرچه نامه فارسی بود ولی در مقصد فارسی دیده نمی شد ونیاز به  اعمال روش هایی بود که شخص قادر باشد نامه را به فرم صحیح فارسی ببیند. اگرچه این  روش نیز هم اکنون مرسوم است، اما باز هم طیف وسیعی از کاربران عادی نیز با این مورد  مشکل دارند.</p>
<p><strong>چرا IrMail مطرح شد؟</strong></p>
<p>شما در این مقاله با  دلایل نیاز به یک شئ ارسال نامه آشنا شدید و اهمیت وجود آنرا برای یک برنامه تحت وب  دید. سپس روش ها و ابزارهای آماده ای که مایکروسافت در این راستا در اختیار برنامه  نویسان قرار داده بود را بررسی نمودیم (البته تا نسخه NET 1.1.). سپس اشاره ای  داشتیم به توانایی NET. در رفع این مشکل (اما توسط خود کاربران). نهایتا موضوع  ارسال نامه های غیر انگلیسی زبان و روشهای کنونی مواجه با آنرا بررسی کردیم.</p>
<p>هم اکنون به شئ IrMail رسیدیم. اینکه چرا تصمیم بر آن شد که شئ‎ای برای  ارسال نامه ایجاد شود، دقیقا به همان دلایل بالا و چند مورد دیگر است. بطوریکه  مشکلات فوق در این شئ تا حد زیادی برطرف شد. در بخش پایانی این مقاله شئ IrMail را  به طور کامل معرفی و مزیت های آن به طور کامل شرح داده خواهد شد.</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/aspnetirmailp1880114-1813/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>صفحه نوردی در ASP.NET</title>
		<link>http://www.irandevelopers.com/programming/aspnetpaging880114-1809/</link>
		<comments>http://www.irandevelopers.com/programming/aspnetpaging880114-1809/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 17:30:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1809</guid>
		<description><![CDATA[حتما تاکنون بعنوان یک برنامه نویس وب به مقوله گزارشگیری برخورد نموده اید. مثلا از شما خواسته اند که لیست فلان اقلام داده ای مانند لیست کالا، لیست سفارشات و&#8230; را تهیه کنید. در بسیار از موارد اگر تعداد این اقلام زیاد باشد معمولا یک لیست بلند بالا را بر روی صفحه مانیتور از شما [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">حتما تاکنون بعنوان یک برنامه نویس وب به مقوله  گزارشگیری برخورد نموده اید. مثلا از شما خواسته اند که لیست فلان اقلام داده ای  مانند لیست کالا، لیست سفارشات و&#8230; را تهیه کنید. در بسیار از موارد اگر تعداد این  اقلام زیاد باشد معمولا یک لیست بلند بالا را بر روی صفحه مانیتور از شما قبول نمی  کنند. از طرف دیگر خود شما هم بعنوان یک برنامه نویس حرفه‎ای که برای کیفیت کار خود  ارزش قائل هستید نباید براحتی از کنار این مساله بگذرید. در یک کلام منظور این است  که آن لیست بلند بالا را صفحه بندی کرده و صفحه به صفحه نشان دهید.</span> <!--<A href="#continue" mce_href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;>فرض کنید که به سایت گوگل رفته اید و کلمه iranasp را جستجو کرده اید. من این  کار را کردم و در زمان نوشتن این مقاله دقیقا تعداد ۱۶۲۰ مورد یافت شد! مقدار زیادی  نیست ولی اگر قرار بود که گوگل همه این موارد را تنها در یک صفحه به من نشان دهد و  نه ۱۶۲ صفحه (با فرض در هر صفحه ده مورد)، گوگل دیگر به این همه ثروت و شهرت نمی  رسید!! شاید فکر کنید من دیوانه شده ام و اصولا چه ربطی میان جستجوی کلمه iranasp و  ثروت و قدرت امپراطوری گوگل وجود دارد؟ بله هیچ ربطی ندارد ولی تصور کنید که روزانه  میلیونها کاربر برای دفعات متعدد به دنبال کلمه یا کلماتی در گوگل و یا دیگر  موتورهای جستجو می گردند و تعداد نتایج آنها به اندازه تعداد نتایج ما ۱۶۲۰ مورد  نیست بلکه حاصل نتایج جستجوها بسیار بیشتر از اینها است. مساله این است که نشان  دادن همه نتایج در یک صفحه در بیشتر مواقع نه امکان پذیر است و نه به  صرفه.</p>
<p>بعبارت دیگر تصور کنید که گوگل می خواست صفحه ای حاوی بیش از یک  میلیون نتیجه جستجو را به ما نشان دهد. آیا می دانید حجم این صفحه به بایت چقدر می  شد؟ من که نمی دانم ولی هرچه باشد آنقدر هست که حوصله من و شما سر برود و دیگر  منتظر نمایش صفحه نتایج نشویم و عطای آن را به لقایش ببخشیم و بر روی آن ضربدر کوچک  بالای پنجره ویندوز کلیک کرده و آن را ببندیم و این همان تیر خلاص به قلب گوگل و  اصولا هر سایتی است. این یعنی اینکه من و شمای نوعی آن تبلیغات درون صفحه گوگل را  نمی بینیم و دیگر بر روی آن لینک که ممکن بود کلیک کنیم دیگر حتما کلیک نمی کنیم و  آن کالای تبلیغ شده را که ممکن بود بخریم دیگر حتما نمی خریم و باقی قضایا و این  یعنی همان چیزی که در بالا در مورد ثروت و شهرت گوگل گفتم و شما حرف من را جدی  نگرفتید! گوگل تنها یک مثال آشنا بود. این مساله را به همه سایتهای وب و احتمالا  محصولات نرم افزاری تعمیم دهید، خواهید دید همین &#8220;صفحه نورد&#8221; کوچک و ساده ما چه نقش  مهمی دارد! امیدوارم که مطلب را گرفته باشید!</p>
<p><strong>صفحه  نورد</strong></p>
<p>عبارت صفحه نوردی را خودم از روی عبارت Page Navigation ساختم.  بیشترین معانی Navigation حول و حوش دریانوردی دور می زند و من هم معادل صفحه نوردی  را برای آن انتخاب کردم. شما اگر پیشنهاد بهتری دارید حتما با من تماس بگیرید. و  اما صفحه نورد، حتما در پائین صفحات گوگل بعد از جستجوی کلمه ای که نتایج زیادی  بهمراه داشته است یک تصویر گوگل با تعداد O های زیاد و نیز در زیر آن تعدادی شماره  را دیده اید. اگر ندیده اید(!) به تصویر زیر نگاه کنید.</p>
<p><img class="alignnone size-full wp-image-1810" title="googlepaging" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/googlepaging.jpg" alt="googlepaging صفحه نوردی در ASP.NET" width="367" height="96" /><br />
شماره ها در اصل  شماره صفحات نتیجه جستجو هستند و برای اینکه لیست این شماره ها خیلی طولانی نشده و  از صفحه بیرون نزند، در هر لحظه تنها تعداد معینی مثلا ده تا یا بیست تا از آنها  آورده شده است. شما با کلیک بر روی شماره ۹ به نهمین صفحه نتیجه می روید و در هر  صفحه ای که باشید، با کلیک بر روی کلمه Next یا Prev به ترتیِب به صفحه بعد یا قبل  از آن می روید.</p>
<p>حالا ما می خواهیم در این مقاله یک صفحه نورد آن هم از نوع  فارسی آن را بسازیم. فارسی بودن یعنی اینکه شماره صفحات و نیز عبارت Next و Prev  همگی به خط زیبای فارسی باشند. نمونه عملی و کاربردی همین صفحه نورد را در همین  سایت IranASP.NET در پائین صفحات خبرها، نتایج جستجو و یا لیست مقالات می  بینید.</p>
<p><strong>چرا صفحه نورد؟</strong></p>
<p>شاید برای شما این سوال پیش بیاید  که وقتی ما از ASP.NET استفاده می کنیم و از کنترل DataGrid آن برای گزارشگیری  استفاده می کنیم که خودش امکان صفحه نوردی را به ما می دهد دیگر چه نیازی به این  صفحه نورد شماست؟ جواب این است:</p>
<p>الف) DataGrid کنترل سنگین و حجیمی است و  برای صفحاتی که سرعت دریافت در آنها حرف اول را می زند چندان مناسب نیست.</p>
<p>ب)  برای استفاده از قابلیت صفحه نوردی DataGrid شما مجبورید در هر رفت و برگشت صفحه هر  بار کلیه رکوردهای نتیجه خود را مثلا هر ده هزارتا را هر بار به خورد DataGrid  بدهید تا او فقط مثلا ده تا را انتخاب و بر روی صفحه نشان دهد و بقیه را دور می  ریزد. برای اینکار شما یا هر بار باید به سراغ پایگاه داده خود رفته و تقاضای خود  را برای دریافت ده هزار رکورد مورد نظر بدهید و این یعنی مصرف بالای منابع، کندی  دسترسی به اطلاعات و طولانی شدن زمان نمایش صفحه و در اکثر مواقع از کار افتادن  برنامه یا سایت شما در حالاتی که حجم داده خیلی بالا بوده و افراد زیادی به سایت  شما آمده اند. اگر هم خوش شانس باشید بگونه‎ای که همه کاربران سایت شما قرار است  تنها به یک سری رکورد مشخص همواره نیاز داشته باشند و شما بخواهید آن تعداد را در  حافظه سرورتان اصطلاحا Cache کنید، بازهم ممکن است حافظه زیادی مصرف کنید و دچار  مشکلات دیگری شوید.</p>
<p>یکی از بهترین و کارآ ترین کنترلهای ASP.NET برای نمایش  اطلاعات هم جنس، کنترل Repeater می باشد. این کنترل ضمن سبکی و نیاز کمتر به پردازش  سمت سرور، دست برنامه نویس را برای هر نوع طراحی صفحه در نمایش اطلاعات باز می  گذارد. تنها مشکل این است که خودتان باید مساله صفحه نوردی آن را حل کنید. چیزی که  این مقاله به دنبال است. لازم بذکر است که این صفحه نورد مورد نظر تنها برای  استفاده در کنار Repeater طراحی نشده است و می توان آن را در کنار سایر تکرار کننده  ها مانند DataGrid و DataList نیز استفاده نمود. بعبارت دیگر این صفحه نورد هیچگونه  وابستگی به هیچ نوع کنترلی در ASP.NET ندارد و می توان در هرکجا از آن استفاه  کرد.</p>
<p><strong>و اما اصل مطلب&#8230;</strong></p>
<p>خوب تا اینجا هرچه گفتیم مقدمه  چینی و حرف بود و احتمالا حوصله شما هم سر رفته است و باید زودتر برویم سراغ اصل  مطلب یعنی کد، والا آن ضربدر کوچک بالای پنجره، ما را هم تهدید می کند!</p>
<p>این  صفحه نورد بصورت یک کنترل کاربری یا یک User Control در نظر گرفته شده است تا بتوان  براحتی در جاهای مختلف یک وبسایت از آن استفاده کرد. کد HTML این کنترل به صورت زیر  است:</p>
<div class="MultiLineCode">&lt;%@ Control Language=&#8221;c#&#8221; AutoEventWireup=&#8221;false&#8221;  Codebehind=&#8221;PageNavigation.ascx.cs&#8221; Inherits=&#8221;YourNamespace.PageNavigation&#8221;  TargetSchema=&#8221;http://schemas.microsoft.com/intellisense/ie5&#8243;  %&gt;<br />
&lt;P&gt;<br />
&lt;TABLE cellSpacing=&#8221;1&#8243; cellPadding=&#8221;3&#8243; width=&#8221;100%&#8221;  border=&#8221;0&#8243;&gt;<br />
&lt;TR&gt;<br />
&lt;TD align=&#8221;middle&#8221;  dir=&#8221;rtl&#8221;&gt;<br />
&lt;asp:Label id=&#8221;lblNav&#8221;  runat=&#8221;server&#8221;&gt;&lt;/asp:Label&gt;<br />
&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;/TABLE&gt;<br />
&lt;/P&gt;</div>
<p>همانگونه که می بینید اصل کد بالا عبارت است از تعریف یک کنترل از نوع Label و  سایر متعلقات بنا به سلیقه شما قابل تغییر است. بخش اصلی این کنترل در قسمت  کدبرنامه یا codebehind آن است. جهت اختصار همه کدبرنامه آن را اینجا نمی آورم و می  توانید کد کامل آن را از بالای همین مقاله دریافت کنید. تنها به معرفی چند متد و  متغیر مهم آن می پردازیم.</p>
<p>• CurrentPage: متغیرنشان دهنده شماره صفحه فعلی.  این متغیر توسط برنامه استفاده کننده جهت انتقال به روال ذخیره شده‎ی پایگاه داده،  بکار می رود.</p>
<p>• PageSize: متغیر نشان دهنده تعداد رکورد در هر صفحه. این  متغیر توسط برنامه استفاده کننده جهت انتقال به روال ذخیره شده‎ی پایگاه داده، بکار  می رود.</p>
<p>• TotalRecords: متغیر نشان دهنده تعداد کل رکوردهای یافته شده. این  متغیر توسط روال ذخیره شده‎ی پایگاه داده مقدار دهی می گردد.</p>
<p>• InitNav: از  این متد جهت مقداردهی اولیه صفحه نورد پیش از ارسال متغیرهای فوق به روال ذخیره شده  پایگاه داده استفاده می گردد.</p>
<p>• ShowNav: این متد جهت نمایش صفحه نورد در  آخرین مرحله، فراخوانی می شود.</p>
<p>• CssClass: از این متغیر جهت تعیین کلاس CSS  این کنترل استفاده می شود.</p>
<p>• InActiveCssClass: از این متغیر جهت تعیین کلاس  CSS موارد غیرفعال این کنترل استفاده می شود (مانند کلمه &#8220;قبلی&#8221; هنگامی که در صفحه  اول هستیم).</p>
<p><strong>نحوه استفاده</strong></p>
<p>این کنترل، همانند یک User  Control معمولی بکار می رود. اگر در Visual Studio .NET هستید، در پنجره Solution  Explorer برروی آن کلیک کرده و بصورت drag-and-drop آن را در صفحه مورد نظر قرار  دهید. همچنین می توانید کد زیر را بصورت دستی در صفحه مورد نظر تایپ  کنید:</p>
<div class="MultiLineCode">&lt;%@ Register TagPrefix=&#8221;uc1&#8243;  TagName=&#8221;PageNavigation&#8221; Src=&#8221;PageNavigation.ascx&#8221;  %&gt;<br />
&#8230;<br />
&lt;uc1:PageNavigation id=&#8221;pnPageNavigate&#8221;  runat=&#8221;server&#8221;&gt;&lt;/uc1:PageNavigation&gt;</div>
<p>حال جهت تعیین مقادیر PageSize و CssClass و یا InActiveCssClass کد فوق را  بصورت زیر تغییر دهید:</p>
<div class="MultiLineCode">&lt;uc1:PageNavigation id=&#8221;pnPageNavigate&#8221;  PageSize=&#8221;10&#8243; runat=&#8221;server&#8221; CssClass=&#8221;yourclassname&#8221;  InActiveCssClass=&#8221;anotherclassname&#8221;&gt;&lt;/uc1:PageNavigation&gt;</div>
<p>البته متغیرهای فوق بترتیب دارای مقادیر ۱۰ و &#8220;&#8221; و &#8220;&#8221; می باشند و لزومی به  مقداردهی آنها نیست. همچنین این مقادیر را می توانید از درون کدبرنامه استفاده  کننده هم مقداردهی کنید.</p>
<p>حال لازم است تا شئ ای از نوع کلاس صفحه نورد یعنی  PageNavigation در کدبرنامه استفاده کننده تعریف نمائیم تا بتوانیم به این کنترل از  درون کدبرنامه استفاده کننده دسترسی داشته باشیم. برای این کار بصورت زیر عمل می  کنیم:</p>
<div class="MultiLineCode">protected YourNamespace.PageNavigation  pnPageNavigate;</div>
<p>حال با استفاده از این متغیر مرجعی، به متغیرهای اساسی کنترل صفحه نوردمان  دسترسی داریم. در کد زیر نحوه بکارگیری آن را می بینیم.</p>
<div class="MultiLineCode">this.pnPageNavigate.InitNav ();<br />
DataSet ds =  GetPagedAllNews (this.pnPageNavigate.CurrentPage ,<br />
this.pnPageNavigate.PageSize,<br />
out  this.pnPageNavigate.TotalRecords);<br />
this.repNews.DataSource =  ds;<br />
this.repNews.DataBind();<br />
this.pnPageNavigate.ShowNav();</div>
<p>در کد فوق نحوه استفاده از متدهای InitNav و ShowNav را می بینیم. همچنین نحوه  ارسال متغیرهای CurrentPage و PageSize و TotalRecords مشخص شده است. تا اینجا، کار  ما با کنترل صفحه نورد تمام شده است. مساله مهم دیگر نحوه بازیابی اطلاعات از  پایگاه داده و استفاده از مقادیر متغیرهای فوق در قالب متد کمکی GetPagedAllNews  است. این متد را بصورت زیر نوشته ایم:</p>
<div class="MultiLineCode">private DataSet GetPagedAllNews (int CurrentPage, int  PageSize, out int TotalRecords)<br />
{<br />
DataSet ds = new DataSet  ();</p>
<p>// Create Instance of Connection and Command Object<br />
SqlConnection myConnection = new SqlConnection(ConnectionString);<br />
SqlCommand myCommand = new SqlCommand(&#8220;procGetPagedAllNews&#8221;,  myConnection);<br />
// Mark the Command as a SPROC<br />
myCommand.CommandType = CommandType.StoredProcedure;<br />
myCommand.Parameters.Add (&#8220;@CurrentPage&#8221;, CurrentPage);<br />
myCommand.Parameters.Add (&#8220;@PageSize&#8221;, PageSize);<br />
myCommand.Parameters.Add (new SqlParameter (&#8220;@TotalRecords&#8221;,  SqlDbType.Int));<br />
myCommand.Parameters ["@TotalRecords"].Direction =  ParameterDirection.Output;</p>
<p>// Create a new SqlDataAdapter object for  the News table<br />
SqlDataAdapter da = new SqlDataAdapter(myCommand);<br />
// Populate the ds with the data<br />
da.Fill(ds);<br />
TotalRecords =  Convert.ToInt32 (myCommand.Parameters ["@TotalRecords"].Value);</p>
<p>return ds;<br />
}</p></div>
<p>بخش مهم دیگر در اینجا همان کد روال ذخیره شده procGetPagedAllNews می باشد که  وظیفه واکشی رکوردهای مورد نظر را بصورت صفحه به صفحه دارد. از آنجا که شرح این  روال در این مقال نمی گنجد تنها به آوردن کد آن اکتفا کرده ام. ابتدا یک جدول در  SQL Server بنام News ساخته و دو عدد فیلد بصورت زیر برای آن تعریف  کنید:</p>
<div class="EnglishParag">NewsID int<br />
NewsTitle nvarchar (256)</div>
<p>سپس یک روال ذخیره شده بصورت زیر در پایگاه داده تان بسازید:</p>
<div class="MultiLineCode">CREATE PROCEDURE dbo.procGetPagedAllNews<br />
(<br />
@CurrentPage int,<br />
@PageSize int,<br />
@TotalRecords int  output<br />
)<br />
AS</p>
<p>SET NOCOUNT ON</p>
<p>&#8211;Create a temp table to hold the  current page of data<br />
&#8211;Add an ID column to count the records<br />
CREATE TABLE  #TempTable<br />
(<br />
ID int IDENTITY PRIMARY KEY,<br />
NewsID int,<br />
NewsTitle nvarchar (256),<br />
)<br />
&#8211;Fill the temp table with the News  data<br />
INSERT INTO #TempTable<br />
(<br />
NewsID,<br />
NewsTitle,<br />
)<br />
SELECT NewsID, NewsTitle<br />
FROM News</p>
<p>&#8211;Create  variable to identify the first and last record that should be  selected<br />
DECLARE @FirstRec int, @LastRec int<br />
SELECT @FirstRec =  (@CurrentPage &#8211; 1) * @PageSize<br />
SELECT @LastRec = (@CurrentPage * @PageSize +  1)<br />
&#8211;Select one page of data based on the record numbers above<br />
SELECT  *<br />
FROM<br />
#TempTable<br />
WHERE<br />
ID &gt; @FirstRec<br />
AND<br />
ID &lt;  @LastRec<br />
&#8211;Return the total number of records available as an output  parameter<br />
SELECT @TotalRecords = COUNT(*) FROM #TempTable</p></div>
<p>حال سایر تنظیمات مانند ConnectionString در کدبرنامه صفحه اصلی را مطابق پایگاه  داده خود قرار دهید و سایر تنظیمات را انجام داده و برنامه را کامپایل و اجرا  کنید.</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/aspnetpaging880114-1809/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>تولید صفحات استاتیک به کمک XML و ASP.NET (بخش دوم)</title>
		<link>http://www.irandevelopers.com/programming/createstaticpagewithaspnetxmlp2880114-1807/</link>
		<comments>http://www.irandevelopers.com/programming/createstaticpagewithaspnetxmlp2880114-1807/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 17:28:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1807</guid>
		<description><![CDATA[تولید مکانیزه صفحات استاتیک به کمک XML اکنون روش مورد نظر در این مقاله را بررسی می‌کنیم. در این روش به جای اینکه یک صفحه دینامیک از جنس ASP‌ یا ASP.NET بسازیم که محتوای هر خبر یا مقاله را نمایش بدهد، یک صفحه Template از جنس XSL می‌سازیم و محل قرارگرفتن داده‌های فیلدهای هر رکورد [...]]]></description>
			<content:encoded><![CDATA[<p><strong>تولید مکانیزه صفحات استاتیک به کمک XML</strong></p>
<p>اکنون روش مورد نظر در این  مقاله را بررسی می‌کنیم. در این روش به جای اینکه یک صفحه دینامیک از جنس ASP‌ یا  ASP.NET بسازیم که محتوای هر خبر یا مقاله را نمایش بدهد، یک صفحه Template از جنس  XSL می‌سازیم و محل قرارگرفتن داده‌های فیلدهای هر رکورد را داخل صفحه مشخص  می‌کنیم. برای ساختن صفحات Template مذکور باید ابتدا صفحات وب را به فرمت XHTML  تبدیل کنیم. سپس با قراردادن فیلدهای موردنظر،‌ صفحه XHTML را به XSL تبدیل  کنیم.</p>
<p><strong>تبدیل HTML‌ به XHTML</strong></p>
<p>ساختن صفحات XHTML بسیار ساده  است. کافی است صفحه معمولی خود را بسازید و محل قرارگرفتن فیلدها را مشخص کنید  (مثلا از طریق تایپ کردن نام هر فیلد) و سپس به کمک یک مبدل HTML به XHTML صفحه وب  خود را به فرمت سازگار با XHTML تبدیل کنید. برنامه‌ای مانند Dreamweaver به کمک یک  فرمان ساده، این کار را به راحتی آب خوردن انجام می‌دهد!</p>
<p>تفاوت یک HTML  معمولی با یک HTML سازگار با فرمت XHTML چندان زیاد نیست. درواقع کنترلی باید روی  صفحه انجام شود تا مطمئن شویم که tagهای صفحه در قیاس با قواعد XML اصطلاحا  well-form هستند. مثلا در فرمت XML هر tag که شروع می‌شود باید حتما پایانی داشته  باشد. مثل &lt;table&gt;&lt;/table&gt; اگر بعضی از tag ها قرار است که تنها باشند  (مثل &lt;br&gt;) این tag‌ ها باید به صورت مثلا &lt;/br&gt; اصلاح شوند. چند تغییر  جزئی دیگر نیز باید صورت گیرد تا صفحه کاملا با فرمت XHTML سازگار باشد. حتی اگر یک  کاراکتر هم ناسازگار با قواعد XML‌ باشد، امکان استفاده از روش توضیح داده شده در  این مقاله وجود نخواهد داشت. ضمنا، کلاس و شئ XML‌ در دات‌نت بعضی از کاراکترها و  ترکیب‌های کاراکتری را نیز نمی‌پذیرد. مثلا ;nbsp&amp; که نمایانگر یک space‌ یا  فاصله است، از دید مفسر XML در دات نت مجاز نیست و به جایش باید همان کاراکتر  space‌ را تایپ کنید. نگران نباشید. محدودیت‌هایی که در این زمینه وجود دارند بسیار  اندک هستند و تقربیا صفحه خود را با حدود یکی دو درصد تغییر می‌توانید به یک XHTML  قابل استفاده برای کلاس XML‌ تبدیل کنید.</p>
<p>یادآوری مهم : ضروری است که صفحات  فارسی خود را از جنس یونی‌کد و با کاراکترست utf-8 بسازید. زیرا شئ xml در دات نت  تنها در این صورت می‌تواند اطلاعات فارسی را بدون مشکل پردازش  کند.</p>
<p><strong>تبدیل XHTML‌ به XSL</strong></p>
<p>این قسمت از کار مهمترین قسمت  ساختن Template مورد نظر است. برای اینکار باید با استاندارد XSL و تکنیک‌ها و زبان  آن آشنا شوید. XSL بحث مفصلی دارد و برای آموختن آن کتاب‌های متعددی چاپ شده است که  لازم است حداقل یکی از آنها را به عنوان مرجع دم دست داشته باشید. من برای سهولت  کار، چند تکنیک ساده و پرکاربرد XSL‌ را که در این مقاله نیاز داریم، داخل فایل  مثالی که ضمیمه مقاله است، پیاده کرده‌ام که می‌توانید از آنها به عنوان الگو  استفاده کنید. XSL‌ به معنی eXtensible Stylesheet Language است. XSL در دنیای  فناوری XML مشابه CSS در دنیای HTML است. اگر با CSS ها آشنایی داشته باشید، درک  کاری که XSL‌ انجام می‌دهد چندان برایتان مشکل نخواهد بود. همانطور که از CSS برای  فرم دادن به صفحات وب استفاده می‌کنیم، از XSL‌ نیز برای فرم دادن به محتویات  فایلهای XML‌ استفاده می‌کنیم.</p>
<p>تکنیک‌هایی که برای پردازش فایل‌های XSL و  قراردادن داده‌های XML‌ استفاده می‌شود اصطلاحا XSLT نام دارد (به انتهای عبارت XSL  کلمه Transformation‌ را بیفزایید).</p>
<p>قلب فرآیندی که اتفاق می‌افتد به این  شرح است :</p>
<p>- داده‌های شما، یعنی اطلاعات رکوردهای خبر و مقاله باید به فرمت  XML درآیند.<br />
- کد برنامه، فایل XSL شما را باز می‌کند و آن را برای یافتن tag  های مخصوص نمایش فیلدهای اطلاعاتی جستجو می‌کند و به محض پیدا کردن محل فیلد،  اطلاعات آن را جایگزین می‌کند.</p>
<p>به عنوان مثال عبارت &lt;&#8221;xsl:value-of  select=&#8221;ArticleTitle&gt; معادل گزینه‌ای است که چند پاراگراف بالاتر به عنوان روش  نمایش فیلد ArticleTitle در صفحه ASP.NET شرح دادم. به عنوان نمونه دیگر، در زبان  XSL با استفاده از syntax زیر می‌توانیم یک حلقه بسازیم :</p>
<div class="MultiLineCode">&lt;xsl:for-each  select=&#8221;//Table&#8221;&gt;<br />
&#8230;<br />
&lt;/xsl:for-each&gt;</div>
<p>که حلقه روی فیلدهای جدول Table‌ تکرار می‌شود.</p>
<p>کاری که ما در برنامه خود  انجام می‌دهیم اینست که ابتدا رکوردهای بانک اطلاعاتی را با استفاده از شئ xml در  دات نت به XML‌ تبدیل می‌کنیم سپس با استفاده از کلاس xslt یک فایل XSL را  بازمیکنیم و داده ها را درون آن میریزیم و حاصل را به صورت یک HTML معمولی ذخیره  می‌کنیم. همین!</p>
<p><strong>کد برنامه تولید مکانیزه صفحات وب با استفاده از  ASP.NET</strong></p>
<p>کاری که ما باید انجام دهید اینست که یک صفحه ASP.NET بسازیم که  عملیات تولید صفحه استاتیک را به طور خودکار انجام دهد تا بتوانیم حاصل فرآیند را  خیلی ساده روی سایت publish کنیم. البته می‌توانیم ASP.NET‌ را طوری بنویسیم که  خودش در محل مشخص شده توسط ما صفحات HTML‌ تولید شده را save کند. در اینصورت باید  میزبان شما قابلیت استفاده از فناوری ASP.NET‌ را در اختیار شما قرار دهد وگرنه  مجبورید صفحات را روی دستگاه خودتان تولید کنید و بعد حاصل کار را به صورت دستی یا  به هر روش دیگر upload کنید.</p>
<p>و حالا سورس کد :<br />
( من از VB.NET استفاده  کرده ام ولی خودتان می‌دانید که چقدر تبدیل آن به #C‌ آسان است)</p>
<p>۱- برای  اجرای برنامه لازم است کلاسهای مورد نیاز را import کنیم :</p>
<div class="MultiLineCode">Imports System.Text<br />
Imports System.Data<br />
Imports  System.Data.SqlClient<br />
Imports System.IO<br />
Imports System.IO.Path<br />
Imports  System.Xml<br />
Imports System.Xml.Xsl</div>
<p>۲- من فرض را براین می‌گذارم که شما یک datagrid خودتان ساخته‌اید و می توانید  در این صفحه ASP.NET رکوردهای اخبار و مقالاتتان را مدیریت کنید. من در این مقاله  روش اینکار را توضیح نمی‌دهم چون روشش خیلی آسان و سرراست است و در همه سایت‌های  مربوط به ASP.NET میتوانید یک دوجین مقاله درباره روش نمایش رکوردهای بانک اطلاعاتی  توسط datagrid پیدا کنید. شما باید همچنین در این datagrid امکان select کردن یک  رکورد (جهت انجام پردازشها مورد نیاز این مقاله) را اضافه کنید. این کار نیز آسان  است و من قصد آموزش آن در اینجا را ندارم.</p>
<p>۳- همه عملیات را یک تابع بسیار  ساده و جادویی انجام می‌دهد <img src='http://www.irandevelopers.com/wp-includes/images/smilies/icon_smile.gif' alt="icon smile توليد صفحات استاتيک به کمک XML و ASP.NET (بخش دوم)" class='wp-smiley' title="توليد صفحات استاتيک به کمک XML و ASP.NET (بخش دوم)" /> </p>
<div class="MultiLineCode">Function GenerateOneHTML(ByVal RecordID As Integer) As  Boolean</p>
<p>&#8216;single node&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Dim myData As  DataSet = GetDataSet()<br />
Dim doc As XmlDataDocument = New  XmlDataDocument(myData)<br />
Dim FileName As String<br />
Dim ln As  Integer<br />
Dim node As XmlElement =  doc.DocumentElement.SelectSingleNode(&#8220;//Table[ID=" + RecordID.ToString +  "]&#8220;)</p>
<p>If Not node Is Nothing Then<br />
Dim doc2 As XmlDocument =  New XmlDocument<br />
doc2.LoadXml(node.OuterXml)</p>
<p>&#8216;Generate  HTML file name<br />
FileName = RecordID.ToString<br />
Dim HTMLsPath  As String = Server.MapPath(&#8220;\&#8221;) + &#8220;Articles\&#8221; +  Trim(doc2.SelectSingleNode(&#8220;//Category&#8221;).InnerText) + &#8220;\&#8221;</p>
<p>&#8216;Transform<br />
Dim xslt As XslTransform = New XslTransform<br />
xslt.Load(HTMLsPath + &#8220;temp.html&#8221;)<br />
Dim writer As XmlTextWriter = New  XmlTextWriter(HTMLsPath + FileName + &#8220;.htm&#8221;,  System.Text.Encoding.UTF8)<br />
&#8216;writer.Formatting =  Formatting.Indented<br />
&#8216;writer.Indentation = 2<br />
xslt.Transform(doc2, Nothing, writer, Nothing)</p>
<p>writer.Close()<br />
End If</p>
<p>Return True<br />
End Function</p></div>
<p>از جزئیات این تابع نترسید. خیلی ساده در سه مرحله، یعنی در سه سوت (!) کار را  تمام می‌کند.</p>
<p>من این تابع را بعد از یک ماه تلاش مداوم به این صورت خلاصه و  مفید نوشتم و خیالتان راحت باشد که صد در صد کار می‌کند. فقط توجه کنید که نام  فیلدهای استفاده شده در این تابع با توجه به نامگذاری فیلدهای پایگاه داده خودم  صورت گرفته است و شما باید این جزئیات تابع را مطابق نیاز خود تغییر دهید. مراحل سه  گانه فوق به این شرح هستند :</p>
<p>۱- خواندن xml از روی dataset<br />
۲- تولید نام  فایل خروجی<br />
۳- تبدیل (Tarnsform)</p>
<p>سومین مرحله که مهترین مرحله است،  درواقع همان عملیات XSLT است. در اینجا باید گفت دست طراحان معماری دات نت درد نکند  که با چهار خط کد می‌توان یک فرآیند XSLT‌ را کامل کرد!</p>
<p><strong>مرحله اول  :</strong><br />
در این مرحله از روی dataset یک xml‌ می‌سازیم :</p>
<div class="MultiLineCode">&#8216;single node&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Dim myData As  DataSet = GetDataSet()<br />
Dim doc As XmlDataDocument = New  XmlDataDocument(myData)<br />
Dim FileName As String<br />
Dim ln As Integer<br />
Dim  node As XmlElement = doc.DocumentElement.SelectSingleNode(&#8220;//Table[ID=" +  RecordID.ToString + "]&#8220;)</div>
<p>توجه کنید که من روش ساختن dataset‌ را توضیح نداده‌ام ولی شما خودتان می‌توانید  تابع GetDataSet را مطابق نیازتان بنویسید. این کار یکی از آسان‌ترین و ابتدایی  ترین روشهای کار با رابط برنامه‌نویسی ADO.NET است (لابد می‌دانید که دو روش عمده  برای خواندن اطلاعات از بانک اطلاعاتی وجود دارد، یکی شئ DataReader و دیگری شئ  DataSet) و من در اینجا برای اجتناب از طولانی شدن مقاله، از توضیح دادن آن صرف‌نظر  کردم.</p>
<p>شئ جادوئی XmlDataDocument کارش تبدیل dataset به XML است. خط آخر این  مرحله یک شئ XmlElement از روی همان رکوردی که می‌خواهیم اطلاعاتش را بخوانیم  می‌سازد. دقت کنید که چطوری نام جدول پایگاه داده و id رکورد را که به صورت input  وارد تابع کرده‌ام، به این شئ خورانده می‌شود.</p>
<p><strong>مرحله دوم :</strong><br />
حالا  باید از روی خروجی xml شئ مذکور یعنی node.OuterXml یک شئ XmlDocument بسازیم و  dataset را کنار بگذاریم (توجه کنید که در سورس اصلی تابعی که نوشته‌ام، مرحله دوم  و سوم را داخل یک شرط if قرار داده‌ام تا اگر رکورد مورد نظر پوچ بود این دو مرحله  اجرا نشوند):</p>
<div class="MultiLineCode">Dim doc2 As XmlDocument = New  XmlDocument<br />
doc2.LoadXml(node.OuterXml)</p>
<p>&#8216;Generate HTML file  name<br />
FileName = RecordID.ToString<br />
Dim HTMLsPath As String =  Server.MapPath(&#8220;\&#8221;) + &#8220;Articles\&#8221; +  Trim(doc2.SelectSingleNode(&#8220;//Category&#8221;).InnerText) + &#8220;\&#8221;</p></div>
<p>در واقع یک XmlDocument در کد برنامه دات نت، معرف یک xml است. و در تمام این  مقاله هرجا گفتم کلاس (یا شئ xml در دات نت) بیشتر مقصودم همین شئ بود. البته کل  اشیاء بکار رفته در این مقاله از کلاس مادر System.xml و System.xml.xsl مشتق شده  اند.</p>
<p>در ادامه این مرحله من کمی با اطلاعات فیلد RecordID بازی کرده ام تا  یک نام دلخواه و یک path مناسب برای دخیره کردن فایل HTML‌ نهایی جور کنم. همچنین  اگر خواستید روی داده‌های رکورد مورد نظر، پیش از قرارگرفتن در XSL تغییری انجام  دهید، مثلا تاریخ میلادی را به شمسی تبدیل کنید، جایش همین مرحله است. با استفاده  از syntax زیر می‌توانید به محتویات یک فیلد از این رکورد دسترسی داشته باشید (قابل  خواندن و نوشتن):</p>
<div class="MultiLineCode">doc2.SelectSingleNode(&#8220;//FieldName&#8221;).InnerText</div>
<p><strong>مرحله سوم :</strong><br />
در این مرحله عملیات جادویی تبدیل صورت می‌گیرد!<br />
خط  اول یک XslTransform معرفی کرده ام. این شئ یک تابع بدقلق اما فوق‌العاده نیرومند  دارد که حدود ده تا تعریف overload دارد. یعنی می‌توان این تابع را به چندین روش  فراخوانی کرد. پیدا کردن حالت مناسب برای این تابع خودش مکافاتی بود (!) ولی حالا  نتیجه کار بسیار ساده از آب درآمده است. من فایل XSL که به روش توضیح داده شده  ساختم را به اسم temp.html در همان مسیری (path) که می‌خواهم فایل خروجی را ذخیره  کنم قرار دادم. ابتدا با استفاده از تابع load این فایل را باز می‌کنم. سپس با  استفاده از یک شئ جادویی دیگر به نام XmlTextWriter یک مجرای خروجی (یک stream)  برای تابع Transform فراهم می‌کنم:</p>
<div class="MultiLineCode">&#8216;Transform<br />
Dim xslt As XslTransform = New  XslTransform<br />
xslt.Load(HTMLsPath + &#8220;temp.html&#8221;)<br />
Dim writer As  XmlTextWriter = New XmlTextWriter(HTMLsPath + FileName + &#8220;.htm&#8221;,  System.Text.Encoding.UTF8)<br />
&#8216;writer.Formatting =  Formatting.Indented<br />
&#8216;writer.Indentation = 2<br />
xslt.Transform(doc2, Nothing,  writer, Nothing)</p>
<p>writer.Close()</p></div>
<p>ذکر چند نکته در اینجا ضروری است:</p>
<p>۱- آدرسی که در مرحله دوم ساختم را به  XmlTextWriter می‌دهم.<br />
۲- فرمت یونی‌کد را نیز برای XmlTextWriter مشخص  می‌کنم.<br />
۳- اگر دلم خواست، از property فرمتینگ نیز استفاده می‌کنم:</p>
<div class="MultiLineCode">writer.Formatting =  Formatting.Indented<br />
writer.Indentation = 2</div>
<p>این property خیلی جالب و در عین حال دردسرساز است. کارش اینست که خروجی HTML  شما را برای خواندن سورس آن فرم بدهد. اگر اینکار را نکنید، XmlTextWriter تمام  فایل HTML شما را در یک خط (!) می‌نویسد. هنگام نمایش HTML هیچ اتفاق یا مشکل خاصی  پیش نمی‌آید اما اگر بروید روی مرورگر گزینه view source را بزنید متوجه می‌شود که  خواندن این فایل واقعا مکافات است!</p>
<p>Property فوق این مشکل را برطرف می‌کند و  خروجی HTML‌ را طوری تولید می‌کند که بشود سورس آن را (مثل آدم‌!) خواند. فقط  اشکالش اینست که در برخی Layout‌ ها به دلیل انداختن یک سری space اضافه، صفحه را  از ریخت می‌اندازد. در مورد سایت من چنین مشکلی پیش آمد و من بیخیال فرمتینگ شدم.  Property دوم که Indentation نام دارد میزان تاثیر گذاری فرمتینگ را مشخص می‌کند.  عدد ۲ نرمال است. اگر بیشتر بدهید، nesting سورس HTML را بیشتر می‌کند، خودتان  امتحان کنید، متوجه خواهید شد.</p>
<p>سرانجام فرمان آسمانی Transform انجام  می‌شود. همه مقاله را به خاطر این تابع پرتشریفات نوشتم. می‌خواستم از اول بگویم  این تابع چه تابع خوبی است، توی رودربایستی افتادم و این مقاله را نوشتم!</p>
<p>فراموش نکنید که مجرای XmlTextWriter را باید پس از اتمام کار بست. حالا  اگر به پوشه‌ای که می‌خواستید فایلتان آنجا ذخیره شود مراجعه کنید می‌بینید که یک  صفحه وب تر و تمیز حاوی مقاله یا خبر شما آنجا نشسته و اسم دلخواه شما را نیز به  خود گرفته است (در اینجا همان کد id).</p>
<p>باید datagrid خودتان را طوری بسازید  که بشود از طریق یک checkbox کنار هر رکورد، آنهایی که مایلید صفحه خبر یا مقاله‌اش  را بسازید، مشخص کرد. سپس یکی یکی id این رکوردها را به تابع مورد بحث می‌دهید تا  به ازای هرکدام از آنها یک صفحه بسازد. توجه کنید که تکرار اجرای این فرمان روی یک  رکورد موجب overwrite شدن فایل قبلی می‌شود. یعنی می‌توانید به سادگی فایل را  update کنید.</p>
<p>اگر خواستید Layout سایت تان را تغییر دهید، کافی است فایل XSL  خود را یکبار دستکاری کنید. اینکار خیلی ساده است. اگر XSL‌ را با پسوند htm یا  html‌ ذخیره کنید، برنامه‌ای مانند Dreamweaver آن را مانند یک صفحه وب معمولی باز  می‌کند تا بتوانید ویرایشش کنید. بعد از تغییر XSL، یکبار دیگر فرمان  Transformation را روی رکورهای مقالات و اخبار تکرارکنید تا صفحات جدید را بدست  آورید.</p>
<p><strong>نتیجه‌گیری :</strong></p>
<p>اگر به صورت مساله اول مقاله  برگردیم، حالا متوجه می‌شویم این سایت‌های خبری بزرگ دنیا چطوری بدون استفاده از  صفحات دینامیک، سایتهای فعالی دارند. در واقع کلکش خیلی آسان بود.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/createstaticpagewithaspnetxmlp2880114-1807/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>تولید صفحات استاتیک به کمک XML و ASP.NET (بخش اول)</title>
		<link>http://www.irandevelopers.com/programming/createstaticpagewithaspnetxmlp1880113-1805/</link>
		<comments>http://www.irandevelopers.com/programming/createstaticpagewithaspnetxmlp1880113-1805/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 17:26:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1805</guid>
		<description><![CDATA[شاید برای شما جالب باشد که بدانید سایت هایی بزرگی چون CNN یا news.com چگونه صفحات خود را تولید می کنند و اینکه چرا پسوند صفحات آنها مثلا بجای asp یا aspx یا php وغیره، html است؟ این مقاله را بخوانید تا با یکی از متداول‌ترین و مناسب‌ترین راه‌های تولید صفحات وب بصورت استاتیک برای [...]]]></description>
			<content:encoded><![CDATA[<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td colspan="2"><span id="_ctl0_Body1_lblSummary" class="date" style="font-weight: bold;">شاید برای شما جالب باشد که بدانید سایت هایی بزرگی چون  CNN یا news.com چگونه صفحات خود را تولید می کنند و اینکه چرا پسوند صفحات آنها  مثلا بجای asp یا aspx یا php وغیره، html است؟ این مقاله را بخوانید تا با یکی از  متداول‌ترین و مناسب‌ترین راه‌های تولید صفحات وب بصورت استاتیک برای سایت‌های با  محتوای دینامیک مانند سایت های خبری یا مقاله‎ای آشنا شوید.</span> <!--<A href="#continue" mce_href="#continue">ادامه مقاله&#8230;</A></p>
<p>&#8211;></td>
</tr>
</tbody>
</table>
<hr />
<table class="text" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td valign="top"><a name="continue"></a><span id="_ctl0_Body1_lblArticleText"><!--</p>
<div class="EnglishParag">
<div class="MultiLineCode">
<p class="text">&#8211;><strong>اشاره:</strong></p>
<p>این مقاله به تشریح یکی از متداول‌ترین و مناسب‌ترین  راه‌های تولید صفحات وب برای سایت‌های با محتوای دینامیک از جمله سایت‌های ناشر خبر  و مقاله به کمک XML می‌پردازد. روشی که در این مقاله توضیح داده شده برای تمام  فناوری‌های ایجاد صفحات دینامیک از جمله ASP.NET ،PHP ،JSP‌ و ColdFusion قابل  اجراست اما در این مقاله تنها به روش پیاده سازی تکنیک مورد بحث با استفاده از  ASP.NET اشاره شده است. برای اینکه بتوانید از این مقاله حداکثر استفاده را داشته  باشید، لازم است قبلا با مبانی XML و XSL آشنایی نسبی داشته باشید ولی برای آندسته  از خوانندگان که اطلاعات خیلی کمی دراین باره دارند، توضیحات مقدماتی آورده شده  است.</p>
<p><strong>صورت مساله</strong></p>
<p>اگر یک طراح و برنامه‌نویس صفحات وب  باشید، حتما تاکنون متوجه شده‌اید که یکی از روش‌های متداول برای نمایش محتوای  اطلاعاتی در سایت‌های خبری اینست که به ازای هر خبر یا مقاله‌ی قابل نمایش در صفحات  سایت، یک رکورد متناظر در پایگاه داده‌های (پایگاه داده) سایت قرار دهیم و اطلاعات  درون فیلدهای هر رکورد را به محض درخواست بازدیدکننده، داخل یک صفحه Template از  جنس ASP یا ASP.NET و غیره نمایش دهیم. اما اگر احیانا به ساختار سایت‌های خبری  بزرگ مانند CNN و news.com توجه کرده باشید، ممکن است از خود پرسیده باشید &lt;چطور  تعداد صفحات وب دینامیک این سایت بسیار اندک یا در حد صفر است؟&gt; چرا بعضی از  سایت خبری بزرگ برای نمایش اخبار و مقالات خود از صفحات html به جای asp و aspx و  php و jsp استفاده می‌کنند؟ چه رازی بر این شیوه حاکم است و اصولا این روش چه مزیتی  دارد؟</p>
<p>به زبان دیگر، سوال اساسی اینست که آیا برای نمایش محتوای دینامیک در  یک سایت وب، حتما مجبور به استفاده از صفحات دینامیک مانند ASP.NET و PHP‌ و غیره  هستیم؟ یا اینکه ترفند دیگری هم وجود دارد؟</p>
<p><strong>بررسی  موضوع</strong></p>
<p>در واقع پاسخ مثبت است. بسته به اینکه منطق شما برای تولید صفحات  خبر و مقاله چگونه باشد، تکنیک‌های متفاوتی برای این منظور وجود دارد که تنها یکی  از آنها بکارگیری صفحات دینامیک است. روشهای دیگری هم برای نمایش محتوای دینامیک در  سایت وجود دارند که ما یکی از آنها را که بهتر به نظر می‌رسد، بررسی خواهیم کرد.  اما شاید یادآوری این نکته بد نباشد که ببینیم روش مرسومی که غالبا سایت‌های کوچک و  متوسط خبری بکار می‌برند ( و مورد نظر این مقاله هم نیست) چگونه عمل می‌کند.</p>
<p>در روش متداول که آسان ترین روش نیز هست، شما به ازای تمام مقالات و اخباری  که فرمت مشابهی دارند، فقط و فقط یک صفحه نمایش دهنده خبر یا مقاله، آنهم از جنس  ASP.NET یا ASP می‌سازید و به کمک آن، محتوای خبر یا مقاله مورد نظر را نمایش  می‌دهید. شما در حقیقت از روش رندرکردن (Render) صفحه در زمان نمایش استفاده  می‌کنید.</p>
<p>مهمترین کاری که باید در این تکنیک صورت گیرد، انتقال مقدار فیلد  کلیدی هر رکورد (معمولا فیلد id) به صفحه Template مذکور و خواندن اطلاعات همان  رکورد از طریق یک فرمان SQL می‌باشد. به عنوان مثال با اجرای URL زیر در یک سایت  فرضی:</p>
<div class="EnglishParag">article.aspx?id=102632</div>
<p>مقدار id مساوی عدد ۱۰۲۶۳۲ به عنوان کلید رکورد به صفحه ASP.NET‌ انتقال یافته و  در داخل صفحه، یک جا به کمک فرمانی مانند عبارت زیر:</p>
<div class="EnglishParag">SELECT * FROM Articles WHERE ID=@id</div>
<p>اطلاعات فیلدهای مربوط به این رکورد را می‌خوانیم و سپس در طول صفحه از طریق  کدهایی مانند عبارت زیر:</p>
<div class="MultiLineCode">&lt;#% DataBinder.Eval( Container,  “DataItem.ArticleTitle” ) %&gt;</div>
<p>داخل صفحه Template نمایش می‌دهیم.</p>
<p>چنانکه ملاحظه می‌کنید، در این روش  هربار که کاربری قصد مشاهده خبر یا مقاله مورد نظر (با کد ۱۰۲۶۳۲) را داشته باشد،  یکبار فرآیند فوق اجرا شده و صفحه دینامیک رندر می‌شود و سپس برای بازدیدکننده  نمایش داده میشود.</p>
<p>در روش دیگری که مقصود این مقاله است، ما مایل هستیم به  ازای هر خبر یا مقاله، یک صفحه استاتیک متمایز داشته باشیم، طوری که کاربر برای  مشاهده مطلب مورد نظر، به عنوان مثال با کلیک کردن روی صفحه‌ای با نام <span dir="ltr">۱۰۲۶۳۲٫htm</span> بتواند آن را مشاهده کند. در این روش باید تکنیکی را  پیدا کنیم که قبلا به ازای تمام رکوردهای خبر و مقاله درون بانک اطلاعاتی، یک صفحه  وب تولید و روی server ذخیره کرده باشیم.</p>
<p><strong>مزایای تولید صفحات استاتیک  از روی رکوردهای پایگاه داده</strong></p>
<p>قبل از هرچیز می‌خواهیم بدانیم اصولا فایده  روش مذکور چیست و درحالی که خیلی ساده می‌توانیم از طریق ترفند  article.aspx?id=102632 یک خبر یا مقاله خاص را به سادگی نمایش دهیم، چرا باید به  ازای هر خبر یک صفحه جداگانه وب تولید کنیم؟</p>
<p><strong>۱- صفحات استاتیک سریعتر  اجرا می‌شوند.</strong><br />
مهمترین دلیل برای روی آوردن به این روش آنست که به این ترتیب  سرعت نمایش صفحات سایت شما بالا می‌رود زیرا صفحات دینامیک مانند ASP.NET و PHP  نیاز به رندر شدن دارند درحالی که صفحات HTML‌ برای نمایش روی مرورگر کاملا آماده  هستند. گذشته از اینها اگر یک سایت خبری پربیننده باشد، تعدد پردازش‌های دینامیک،  فشار زیادی را روی سرور ایجاد می‌کند که در مجموع راندمان آن را پایین می‌آورد. حتی  اگر سایت شما بیننده اندکی داشته باشد، در صورتی که از روش Shared Hosting استفاده  کنید، توانایی سرور برای همان تعداد اندک بازدیدکننده چندان بالا نخواهد بود و شما  در همان میزان اندک نیز شاهد کاهش راندمان سایت متناظر با افزایش تعداد  بازدیدکنندگان خواهید بود.</p>
<p><strong>۲- Load‌ روی پایگاه داده کم  می‌شود.</strong><br />
حسن بزرگ دیگری که از بکارگیری روش توصیه شده در این مقاله حاصل  می‌شود آنست که فشار روی پایگاه داده کم می‌شود. به عنوان یک توصیه کلی و یک اصل  تجربه شده همواره به خاطر داشته باشید که هرچه استفاده از پایگاه داده ها در یک  سایت کمتر باشد بهتر است! این هنر نیست که شما برای تکمیل هر فرآیند کوچکی در سایت  خود از پایگاه داده‌ استفاده کنید زیرا افزایش میزان استفاده از بانک اطلاعاتی موجب  کند شدن سرعت نمایش صفحات از یک سو و نیز بالا رفتن میزان منابع سیستمی مورد نیاز  برای پردازشهای دینامیک (resources) از سوی دیگر می‌شود. بنابراین همواره در جستجوی  روش هایی باشید که از پایگاه داده‌کمتر استفاده شود. استفاده موجز و مختصر و موثر  از پایگاه داده یک روش صد در صد توصیه شده از سوی برنامه نویسان باتجربه  است.</p>
<p><strong>۳- وابستگی سایت شما به پایگاه داده کم می‌شود.</strong><br />
به طور کلی  وقتی تعداد صفحات دینامیک یک سایت کمتر می‌شود، وابستگی آن به پایگاه داده‌ نیز  کمتر می‌شود و این به معنی کاهش منابع اشکال زا در هنگام وقوع خطاست. به عنوان مثال  سایتی که شدیدا به پایگاه داده ها وابسته است در صورتی که برای چند دقیقه پایگاه  داده دچار مشکل یا down شود، ممکن است ده‌ها بازدیدکننده را با خطا یا exception  مربوط به در دسترس نبودن بانک اطلاعاتی مواجه کند. سایتی که از صفحات استاتیک بیشتر  استفاده می‌کند کمتر در این مواقع دچار اشکال و نارسایی می‌شود.</p>
<p><strong>۴-  جستجوی صفحه برای ماشین‌های جستجو آسان می‌شود.</strong><br />
دقت کنید که برخی از  موتورهای جستجو، چه آنهایی که روی کل اینترنت کار می‌کنند و چه آنهایی که روی یک  سایت مشخص عمل می‌کنند، با برخی پارامترهای انتقال داده شده به یک صفحه دینامیک  مشکل دارند. بهترین و سریع‌ترین روش ممکن برای ایندکس شدن صفحات وب یک سایت در یک  موتور جستجو اینست که آن صفحه اساسا به صورت استاتیک باشد.</p>
<p><strong>۵- استناد به  URL‌ یک خبر یا مقاله خاص برای مردم آسانتر می‌شود.</strong><br />
فراموش نکنید که وقتی  آدرس یک  خبریامقالهدرسایتشمابهصورتarticle.aspx?id=102632&amp;cat=214&amp;sessionid=423442<br />
و مشابه اینها (یا در اغلب اوقات حتی پیچیده‌تر) است، به خاطر سپاری آدرس و یا  درج آن در کتاب‌های و مجلات و روزنامه‌ها سخت‌تر می‌شود. درحالی که آدرس یک صفحه به  صورت <span dir="ltr">۱۰۲۶۳۲٫htm</span> خیلی راحت‌تر است و احتمال اینکه موقع نوشتن  یا تایپ یا حتی به خاطر سپردن آدرس، اشتباهی صورت بگیرد کمتر است.</p>
<p><strong>۶-  آرشیو کردن اخبار و مقالات بهینه‌تر می‌شود.</strong><br />
یادتان نرود که اگر قرار باشد  سایت شما برای مدت چند سال فعالیت کند آنوقت باید حجم عظیمی از اطلاعات را به صورت  دینامیک داخل پایگاه داده‌ نگهداری کنید. اینکار هم هزینه شما را بالا می‌برد (  بخصوص اگر از SQL Server‌ یا MySQL‌ یا ORACLE‌ و DBMS‌های دیگر استفاده کرده  باشید) و نگهداری‌اش سخت می‌شود. اگر مهمترین کاربرد بانک اطلاعاتی در سایت شما  نگهداری محتوای اخبار و مقالات است، بهتر است فقط آخرین x رکورد را داخل پایگاه  داده‌ دم دست نگه دارید و بقیه رکوردها را از بانک اطلاعاتی خارج، و به طریقی که  صلاح می‌دانید (مثلا ذخیره کردن به صورت صفحات استاتیک وب) آرشیو کنید. به این  ترتیب رکوردهای قدیمی شما خیلی ساده از طریق جابجا کردن صفحات وب، قابل انتقال  خواهند بود و اگر زمانی تصمیم بگیرید Host‌ خود را عوض کنید، برای جابجا کردن  داده‌های درون پایگاه داده‌ مکافات نخواهید داشت!</p>
<p><strong>۷- برای نمایش صفحات  سایت به Host ارزان‌تری نیاز خواهید داشت.</strong><br />
به کمک روش تولید مکانیزه صفحات  استاتیک می‌توانید تمام یک سایت را با صفحات معمولی HTML بسازید، بدون اینکه  نیازمند استفاده از قابلیت‌های یک web server خاص باشید. مثلا اگر از یک میزبان  ارزان قیمت استفاده می‌کنید که به شما اجازه استفاده از امکانات پیشرفته‌ای چون  پایگاه داده را نمی‌دهد، می‌توانید سایت خود را به طور کامل به صورت استاتیک  بسازید. به این ترتیب که روی یک دستگاه خانگی سایت خود را شبیه‌سازی می‌کنید و  صفحات استاتیک را با روش توضیح داده شده در این مقاله تولید می‌کنید و سپس حاصل کار  را در دوره‌های زمانی مشخص به میزبان سایت اصلی خودتان upload می‌کنید. البته اگر  سایت خود را تمام استاتیک بسازید، امکان پیاده سازی قابلیت‌هایی مانند جستجو (منظور  خود صفحه جستجوگر است نه صفحاتی که مورد جستجو قرار می‌گیرند) را نخواهید داشت.</p>
<p></span></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/createstaticpagewithaspnetxmlp1880113-1805/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

