<?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>مجله تکنولوژی آی تی تی</title>
	<atom:link href="https://ittutorial.ir/feed/" rel="self" type="application/rss+xml" />
	<link>https://ittutorial.ir</link>
	<description></description>
	<lastBuildDate>Wed, 20 Nov 2024 04:49:24 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.10</generator>
	<item>
		<title>سورس پروژه رمزنگاری توسط Cryptography</title>
		<link>https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d9%be%d8%b1%d9%88%da%98%d9%87-%d8%b1%d9%85%d8%b2%d9%86%da%af%d8%a7%d8%b1%db%8c-%d8%aa%d9%88%d8%b3%d8%b7-cryptography/</link>
					<comments>https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d9%be%d8%b1%d9%88%da%98%d9%87-%d8%b1%d9%85%d8%b2%d9%86%da%af%d8%a7%d8%b1%db%8c-%d8%aa%d9%88%d8%b3%d8%b7-cryptography/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Fri, 15 Nov 2024 08:11:04 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1365</guid>

					<description><![CDATA[رمزنگاری اطلاعات در پروژه همیشه یکی از عوامل مهم در تعیین امنیت اطلاعات محسوب میشود ، در این پروژه که به زبان سی شارپ نوشته شده است عملیات رمزنگاری و رمزگشایی را توسط الگوریتم Cryptography انجام میدهیم. این الگوریتم فهم تکنیک های ریاضی میباشد که در مفاهیم امنیت اطلاعات مانند محرمانگی، یکپارچگی داده و احراز هویت &#8230;]]></description>
										<content:encoded><![CDATA[<p>رمزنگاری اطلاعات در پروژه همیشه یکی از عوامل مهم در تعیین امنیت اطلاعات محسوب میشود ، در این پروژه که به زبان سی شارپ نوشته شده است عملیات رمزنگاری و رمزگشایی را توسط الگوریتم Cryptography انجام میدهیم. این الگوریتم فهم تکنیک های ریاضی میباشد که در مفاهیم امنیت اطلاعات مانند محرمانگی، یکپارچگی داده و احراز هویت موجودیت و اصل داده آمیخته شده است. همانطور که گفته شد، علم Cryptography پیام های رمز نشده را با کمک مفهوم رمزنگاری به صورت رمزشده، در میآورد ( داده را رمزنگاری میکند). تکنیک های مدرن رمزنگاری، بصورت مجازی غیرقابل شکستن هستند اما این امکان وجود دارد که بتوان پیام های رمزشده را با مفاهیم رمزگشایی که به <a href="http://www.vectorsite.net/ttcode_01.html" target="_blank" rel="nofollow noopener">code breaking</a> معروف هستند، شکست.</p>
<p dir="ltr">private static string Encrypt(string Password)<br />
{<br />
if (string.IsNullOrEmpty(Password))<br />
return string.Empty;</p>
<p dir="ltr">byte[] Value = Encoding.UTF8.GetBytes(Password);<br />
SymmetricAlgorithm mCSP = new RijndaelManaged();<br />
mCSP.Key = _key;<br />
mCSP.IV = _initVector;<br />
using (ICryptoTransform ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV))<br />
{<br />
using (MemoryStream ms = new MemoryStream())<br />
{<br />
using (CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write))<br />
{<br />
cs.Write(Value, 0, Value.Length);<br />
cs.FlushFinalBlock();<br />
cs.Close();<br />
return Convert.ToBase64String(ms.ToArray());<br />
}<br />
}<br />
}<br />
}</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d9%be%d8%b1%d9%88%da%98%d9%87-%d8%b1%d9%85%d8%b2%d9%86%da%af%d8%a7%d8%b1%db%8c-%d8%aa%d9%88%d8%b3%d8%b7-cryptography/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آموزش مفاهیم پایه در Material Design جلسه اول</title>
		<link>https://ittutorial.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d9%85%d9%81%d8%a7%d9%87%db%8c%d9%85-%d9%be%d8%a7%db%8c%d9%87-%d8%af%d8%b1-material-design-%d8%ac%d9%84%d8%b3%d9%87-%d8%a7%d9%88%d9%84/</link>
					<comments>https://ittutorial.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d9%85%d9%81%d8%a7%d9%87%db%8c%d9%85-%d9%be%d8%a7%db%8c%d9%87-%d8%af%d8%b1-material-design-%d8%ac%d9%84%d8%b3%d9%87-%d8%a7%d9%88%d9%84/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Fri, 01 Nov 2024 08:25:34 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1337</guid>

					<description><![CDATA[Material Design Lite، یا DML یک کتابخانه کامپوننت UI است که با CSS، JavaScript و HTML ساخته شده است. DML در ساختن صفحات و اپلیکیشن های وب جذاب، یکپارچه و کاربردی کمک می کند، در عین حال که به اصول طراحی وب مدرن مانند قابلیت حمل در مرورگرها، مستقل از دستگاه بودن و… نیز وفادار &#8230;]]></description>
										<content:encoded><![CDATA[<p>Material Design Lite، یا DML یک کتابخانه کامپوننت UI است که با CSS، JavaScript و HTML ساخته شده است. DML در ساختن صفحات و اپلیکیشن های وب جذاب، یکپارچه و کاربردی کمک می کند، در عین حال که به اصول طراحی وب مدرن مانند قابلیت حمل در مرورگرها، مستقل از دستگاه بودن و… نیز وفادار می ماند. MDL در ایجاد وب سایت های سریع تر، زیباتر و ریسپانسیو به ما کمک می کند. MDL از Google Material Design الهام گرفته شده است.</p>
<h2> Material Design</h2>
<h3>مخاطبین</h3>
<p>این دوره آموزشی برای طراحان حرفه ای که می خواهند مفاهیم اولیه Material Design Lite را یاد بگیرند و همچنین یاد بگیرند که چگونه از آن برای جذاب تر و سریعتر شدن وب سایت خود استفاده کنند، مناسب است. این دوره آموزشی تمام مفاهیم اساسی و پایه Material Design Lite را توضیح می دهد.</p>
<h3>پیش نیازها</h3>
<p>قبل از شروع این آموزش، باید آشنایی اولیه با HTML، CSS، JavaScript، Document Object Model(DOM) و ویرایشگرهای متن داشته باشید. علاوه بر این، اگر نحوه کار اپلکیشن های تحت وب را هم بدانید، بسیار برای شما مفید خواهد بود.</p>
<p>&nbsp;</p>
<h3>Material Design Lite چیست؟</h3>
<p>MDL یک کتابخانه کامپوننت UI است که با CSS، JavaScript و HTML ساخته شده است. DML در ساختن صفحات و اپلیکیشن های وب جذاب، یکپارچه و کاربردی کمک می کند، در عین حال که به اصول طراحی وب مدرن مانند قابلیت حمل در مرورگرها، مستقل از دستگاه بودن و… نیز وفادار می ماند. <a href="https://web.archive.org/web/20160704034722/http://www.mspsoft.com/1394/11/22/material-design-is-and-how-it-came-into-being/" target="_blank" rel="noopener">MDL </a>در ایجاد وب سایت های سریع تر، زیباتر و ریسپانسیو به ما کمک می کند.</p>
<p>برخی از ویژگی های مهم متریال دیزاین:</p>
<ul>
<li>طراحی ریسپانسیو به صورت پیش فرض</li>
<li>CSS استاندارد با کمترین footprint</li>
<li>شامل ورژن های جدید کنترل های متداول رابط کاربری مانند Button، check box، text field که برای پیروی از مفاهیم متریال دیزاین ایجاد شده اند.</li>
<li>شامل ویژگی های بهینه و سفارشی شده مانند cards، column layouts، sliders، spinners، tabs، typography و…</li>
<li>می تواند بدون یا به همراه هر کتابخانه یا محیط توسعه ای استفاده شود.</li>
<li>قابل اجرا روی همه مرورگرها، همچنین می تواند در ایجاد کامپوننت های قابل استفاده مجدد نیز استفاده شود.</li>
<li>همچنین رایگان می باشد.</li>
</ul>
<p>&nbsp;</p>
<h3>طراحی واکنش گرا</h3>
<ul>
<li>Material Design Lite به طور پیش فرض طراحی ریسپانسیو دارد، بنابراین وب سایت های ایجاد شده با Material Design Lite روی هر دستگاه مطابق با اندازه آن دوباره خود را می سازند.</li>
<li>کلاس های Material Design Lite طوری ساخته شده اند که وب سایت ها بتوانند با هر اندازه صفحه ای درست نمایش داده شوند.</li>
<li>وب سایت های ایجاد شده با Material Design Lite به طور کامل با PC، Tablet و mobileها سازگار هستند.</li>
</ul>
<p>&nbsp;</p>
<h3>CSS استاندارد</h3>
<ul>
<li>Material Design Lite فقط از CSS استاندارد استفاده می کند که این یادگیری را آسان می کند.</li>
<li>به هیچ کتابخانه خارجی جاوا اسکریپت مانند جی کوئری نیاز ندارد.</li>
</ul>
<h3>قابلیت توسعه</h3>
<ul>
<li>Material Design کمترین میزان طراحی را دارد و بسیار flat است.</li>
<li>Shadow (سایه) و bold colors را پشتیبانی می کند.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d9%85%d9%81%d8%a7%d9%87%db%8c%d9%85-%d9%be%d8%a7%db%8c%d9%87-%d8%af%d8%b1-material-design-%d8%ac%d9%84%d8%b3%d9%87-%d8%a7%d9%88%d9%84/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>چگونه آیکون Show Desktop را برگردانیم</title>
		<link>https://ittutorial.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%a2%db%8c%da%a9%d9%88%d9%86-show-desktop-%d8%b1%d8%a7-%d8%a8%d8%b1%da%af%d8%b1%d8%af%d8%a7%d9%86%db%8c%d9%85/</link>
					<comments>https://ittutorial.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%a2%db%8c%da%a9%d9%88%d9%86-show-desktop-%d8%b1%d8%a7-%d8%a8%d8%b1%da%af%d8%b1%d8%af%d8%a7%d9%86%db%8c%d9%85/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Thu, 24 Oct 2024 08:01:04 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">http://ittutorial.ir/?p=940</guid>

					<description><![CDATA[۱ &#160; برای برگرداندن آیکون Show Desktop ابتدا Notepad را باز کنید. &#160; این کار را می‌توانید با باز کردن Start و کلیک روی Run… و سپس نوشتن Notepad و زدن Enter انجام دهید. ۲ &#160; دستورات زیر را داخل آن بنویسید. [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop ۳ &#160; حالا Save as را از منوی &#8230;]]></description>
										<content:encoded><![CDATA[<h3>۱</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1259" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-1.jpg" alt="" width="625" height="349" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-1.jpg 625w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-1-300x168.jpg 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<p>&nbsp;</p>
<p>برای برگرداندن آیکون Show Desktop ابتدا Notepad را باز کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1258" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-1-2.jpg" alt="" width="685" height="383" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-1-2.jpg 685w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-1-2-300x168.jpg 300w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<p>&nbsp;</p>
<p>این کار را می‌توانید با باز کردن Start و کلیک روی Run… و سپس نوشتن Notepad و زدن Enter انجام دهید.</p>
<h3>۲</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1257" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-2.jpg" alt="" width="689" height="370" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-2.jpg 689w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-2-300x161.jpg 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<p>&nbsp;</p>
<p>دستورات زیر را داخل آن بنویسید.<br />
[Shell]
Command=2<br />
IconFile=explorer.exe,3<br />
[Taskbar]
Command=ToggleDesktop</p>
<h3>۳</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1256" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-3.jpg" alt="" width="689" height="392" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-3.jpg 689w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-3-300x171.jpg 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<p>&nbsp;</p>
<p>حالا Save as را از منوی File انتخاب کنید.</p>
<h3>۴</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1255" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-4.jpg" alt="" width="691" height="391" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-4.jpg 691w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-4-300x170.jpg 300w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-4-390x220.jpg 390w" sizes="(max-width: 691px) 100vw, 691px" /></p>
<p>&nbsp;</p>
<p>به آدرس C:\WINDOWS\system32 (در ویندوز XP) و یا C:\WINNT\system32 (در ویندوز ۲۰۰۰ یا NT) بروید.</p>
<h3>۵</h3>
<p>&nbsp;</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1254" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5-1.jpg" alt="" width="688" height="389" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5-1.jpg 688w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5-1-300x170.jpg 300w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5-1-390x220.jpg 390w" sizes="(max-width: 688px) 100vw, 688px" /></p>
<p>&nbsp;</p>
<p>اسم فایل را Show Desktop.scf بگذارید. (در صورتی که Notepad پسوند .txt را به فایل اضافه کرد، آن را حذف کنید، فایل با نام Show Desktop.scf.txt کار نخواهد کرد.)</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1253" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5.jpg" alt="" width="687" height="389" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5.jpg 687w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5-300x170.jpg 300w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-5-390x220.jpg 390w" sizes="(max-width: 687px) 100vw, 687px" /><br />
قبل از ذخیره کردن در قسمت Save as type باید All Files را انتخاب کنید.</p>
<h3>۶</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1252" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-6.jpg" alt="" width="688" height="387" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-6.jpg 688w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-6-300x169.jpg 300w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-6-390x220.jpg 390w" sizes="(max-width: 688px) 100vw, 688px" /></p>
<p>&nbsp;</p>
<p>حالا برای برگرداندن آیکون Show Desktop به نوار quick launch یک shortcut به این فایل ایجاد کنید (در آدرسی که فایل را save کردید روی آن کلیک راست کنید و create shortcut را بزنید).</p>
<h3>۷</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1251" src="http://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-7.jpg" alt="" width="685" height="387" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-7.jpg 685w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-7-300x169.jpg 300w, https://ittutorial.ir/wp-content/uploads/2017/06/Show-Desktop-Icon-7-390x220.jpg 390w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<p>&nbsp;</p>
<p>این shortcut را به نوار quick launch انتقال دهید.</p>
<h3>نکات و هشدارها</h3>
<blockquote><p>اگر هنگام برگرداندن آیکون Show Desktop در مرحله‌ی Save as به آدرس<br />
C:\Documents and Settings\\Application Data\Microsoft\Internet Explorer\Quick Launch<br />
رفته و فایل را در آنجا ذخیره کنید، دیگر نیازی به ایجاد shortcut هم نخواهد بود. هر دو روش جواب می‌دهند اما اگر این کار را بکنید دیگر لازم نیست نگران پاک شدن یا تغییر کردن فایل اولیه باشید.<br />
– اگر درباره‌ی username خود مطمئن نیستید یا آن را نمی‌دانید، می‌توانید در قسمت File name، تایپ کنید %appdata% و enter را بزنید، سپس به راحتی به آدرس \Microsft\Internet Explorer\Quick Launch بروید.</p></blockquote>
<blockquote><p>همچنین می‌توانید از میان‌بر Windows + D (ویندوز همان کلید استارت منو روی کیبورد است) برای نمایش یا مخفی کردن دسکتاپ استفاده کنید که دقیقاً‌ مثل همین کلید عمل می‌کند.</p></blockquote>
<blockquote><p>می‌توانید روی آیکون کلیک‌راست کرده و نام آن را به Show Desktop تغییر دهید تا این نوشته در نوشته‌ی راهنمای این آیکون ظاهر شود.</p></blockquote>
<blockquote><p>اگر کد داخل فایل را درست مانند چیزی که در این چگونه گفته شده وارد نکنید ممکن است کامپیوترتان رفتار غیرمنتظره‌ای نشان دهد.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%a2%db%8c%da%a9%d9%88%d9%86-show-desktop-%d8%b1%d8%a7-%d8%a8%d8%b1%da%af%d8%b1%d8%af%d8%a7%d9%86%db%8c%d9%85/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>مقاله کامل آموزش Session در ASP.Net</title>
		<link>https://ittutorial.ir/%d9%85%d9%82%d8%a7%d9%84%d9%87-%da%a9%d8%a7%d9%85%d9%84-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-session-%d8%af%d8%b1-asp-net/</link>
					<comments>https://ittutorial.ir/%d9%85%d9%82%d8%a7%d9%84%d9%87-%da%a9%d8%a7%d9%85%d9%84-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-session-%d8%af%d8%b1-asp-net/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Tue, 08 Oct 2024 08:25:40 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1384</guid>

					<description><![CDATA[این مقاله Session در ASP.Net توصیف میکند. انواع مختلف Session و پیکربندی آنها. همچنین Session ها را در Web Farm , Load Balancer و Web Garden scenarios توصیف میکند. پس با من در این آموزش جامع Session در ASP.Net همراه باشید .توضیح زیادی در اینجا براتون نمینویسم در ادامه میتونید از فهرست استفاده کنید. جدول &#8230;]]></description>
										<content:encoded><![CDATA[<p>این مقاله Session در ASP.Net توصیف میکند. انواع مختلف Session و پیکربندی آنها. همچنین Session ها را در Web Farm , Load Balancer و Web Garden scenarios توصیف میکند. پس با من در این آموزش جامع Session در ASP.Net همراه باشید .توضیح زیادی در اینجا براتون نمینویسم در ادامه میتونید از فهرست استفاده کنید.</p>
<p>جدول عناوین</p>
<p>معرفی</p>
<p>Session چیست؟<br />
مزایا و معایب Session<br />
ذخیره و دریافت مقادیر از Session<br />
Session ID<br />
Mode Session و State Provider<br />
State Provider<br />
رویداد Session<br />
Session Mode<br />
InProc Session Mode<br />
دیدگاهی بر InProc Session Mode<br />
چه زمانی باید از InProc Session استفاده کنیم؟<br />
مزایا و معایب<br />
StateServer Session Mode<br />
دیدگاهی بر StateServer Session Mode<br />
پیکربندی برای StateServer Session Mode<br />
چگونه StateServer Session Mode کار میکند؟<br />
مثالی از StateServer Session Mode<br />
مزایا و معایب<br />
SQL Server Session Mode<br />
چگونه SQL Server Session Mode کار میکند؟<br />
چه زمانی باید از SQL Server Session Mode استفاده کنیم؟<br />
پیکربندی برای SQL Server Session Mode<br />
مزایا و معایب<br />
Custom Session Mode<br />
چگونه Custom Session Mode کار میکند؟<br />
چه زمانی باید از Custom Session Mode استفاده کنیم؟<br />
پیکربندی برای Custom Session Mode<br />
مزایا و معایب<br />
دیدگاهی بر گسترش تولید<br />
Application Pool<br />
هویت Application Pool<br />
ساخت و اختصاص Application Pool<br />
Web Garden<br />
چگونه Web Garden بسازیم؟<br />
چگونه Session به Web Garden بستگی دارد؟<br />
Web Farm و Load Balance<br />
کنترل Session در Web Farm و Load Balance Scenarios<br />
Session و Cookies<br />
Cookie-Munging چیست؟<br />
چگونه Cookie-Munging در ASP.Net کار میکند؟<br />
حذف Session<br />
فعال و غیر فعال کردن Session<br />
جمع بندی<br />
معرفی<br />
قبل از هر چیزی میخواهم از تمام خوانندگانی که مقاله های مرا میخوانند و نظر میدهند تشکر کنم. در سری راهنمایی به مبتدیان من تعدادی مقاله در State Managment نوشته ام. احتمالا این آخرین مقاله ی من در رابطه با State Managment میباشد.</p>
<p>Session چیست؟<br />
وب Stateless است. به این معنا که یک مقدار جدید از هر کلاس Web Page در هر باری که صفحه به سرور فرستاده میشود بازسازی میشود. همانطور که همگی میدانیم HTTP یک پروتکول Stateless است. نمیتواند اطلاعات کاربر را بر روی صفحه نگه دارد. اگر که کاربر اطلاعاتی را وارد کند و به صفحه ی بعدی برود آن اطلاعات از دست میروند و کاربر قادر به بازیابی آن اطلاعات نخواهد بود. در اینجا به چه نیاز داریم ؟ احتیاج به ذخیره کردن اطلاعات داریم. Session امکان ذخیره اطلاعات بر روی حافظه ی سرور را ارائه میدهد. امکان ذخیره سازی هر نوع اشیایی به همراه اشیای اختصاصی خودتان را پشتیبانی میکند. به ازای هر کاربر داده های Session به صورت مجزا ذخیره میشود که به این معناست که داده های Session بر مبنای هر کاربر ذخیره میشوند. به دیاگرام زیر نگاهی بیاندازید :</p>
<p>Session in ASP.Net</p>
<p>Fig: به ازای هر کاربر داده های Session به صورت مجزا ذخیره میشود</p>
<p>State Management با استفاده از Session یکی از بهترین مزیت های ASP.Net است زیرا امن است , برای کاربران شفاف است و قادر به ذخیره ی هر نوع شئ در آن هستیم. به همراه این مزایا گاهی اوقات Session ممکن است اشکالات اجرایی در سایت هایی با ترافیک بالا بوجود آورد زیرا ذخیره سازی در حافظه ی سرور انجام میشود و کاربران داده ها را از سرور میخوانند. حال بیایید نگاهی بیاندازیم به مزایا و معایب استفاده از Session در برنامه های وب مان.</p>
<p>مزایا و معایب Session<br />
در زیر مزایا و معایب پایه ای استفاده از Session آمده است. من بعدا آنها را در انواع Session ها به همراه جزئیات توصیف میکنم.</p>
<p>مزایا<br />
به نگه داشتن حالت کاربر و داده در تمام برنامه کمک میکند</p>
<p>به سادگی اجرا میشود و قادر خواهیم بود تا هر نوع شئ را در آن ذخیره کنیم</p>
<p>داده های کاربر را به صورت مجزا ذخیره میکند</p>
<p>Session امن است و برای کاربر کاملا شفاف است.</p>
<p>معایب<br />
اجرای Overhead در مواردی با حجم عظیمی از داده/کاربر زیرا داده های Session در حافظه ی سرور ذخیره میشود.</p>
<p>Overhead شامل مرتب کردن و به هم ریختن داده های Session است زیرا در موارد Mode Session StateServer و SQLServer Session Mode ما نیاز به مرتب سازی اشیا پیش از ذخیره سازی آنها داریم.</p>
<p>به غیر از این ها مزایا و معایب زیادی در Session وجود دارد که مختص به نوع خاص آن Session است. درباره همه ی آنها در بخش های مربوطه توضیح داده ام.</p>
<p>ذخیره و دریافت مقادیر از Session<br />
ذخیره و دریافت مقادیر در Session مشابه به همان در ViewState میباشد. میتوانیم با Session State با کلاس System.Web.SessionState.HttpSessionState ارتباط برقرار کنیم زیرا این شئ Built-in Session را در صفحات ASP.Net ارائه میدهد.</p>
<p>کد زیر برای ذخیره سازی مقادیر در Session استفاده میشود:</p>
<p>1<br />
2<br />
//Storing UserName in Session<br />
Session[&#8220;UserName&#8221;] = txtUser.Text;<br />
حال ببینیم که چگونه میتوان مقادیر را از Session دریافت نمود:</p>
<p>1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
//Check weather session variable null or not<br />
if (Session[&#8220;UserName&#8221;] != null)<br />
{<br />
//Retrieving UserName from Session<br />
lblWelcome.Text = &#8220;Welcome : &#8221; + Session[&#8220;UserName&#8221;];<br />
}<br />
else<br />
{<br />
//Do Something else<br />
}<br />
همچنین میتوانیم اشیا را در Session ذخیره کنیم. مثال زیر نشان میدهد که چگونه یک DataSet را در Session ذخیره کنیم.</p>
<p>1<br />
2<br />
//Storing dataset on Session<br />
Session[&#8220;DataSet&#8221;] = _objDataSet;<br />
کد زیر نشان میدهد که چگونه DataSet را از Session دریافت کنیم:</p>
<p>1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
Check weather session variable null or not<br />
if (Session[&#8220;DataSet&#8221;] != null)<br />
{<br />
//Retrieving UserName from Session<br />
DataSet _MyDs = (DataSet)Session[&#8220;DataSet&#8221;];<br />
}<br />
else<br />
{<br />
//Do Something else<br />
}<br />
منبع:</p>
<p>http://msdn.microsoft.com/en-us/library/ms178581.aspx – CodeExamples</p>
<p>Session ID<br />
ASP.Net از یک شناساگر 120 بیتی برای ردیابی هر Session استفاده میکند. این به قدر کافی ایمن است و نمیتواند مهندسی معکوس شود. زمانی که یک کاربر با سرور ارتباط برقرار میکند فقط Session ID بین آنها رد و بدل میشود. زمانی که کاربر تقاضای دریافت داده میکند , ASP.Net به دنبال Session ID میگردد و داده های مربوط به آن را دریافت میکند. در گام های زیر این کار را ببینید :</p>
<p>کاربر وارد صفحه میشود و اطلاعات در Session ذخیره میشود.</p>
<p>سرور یک Session ID انحصاری برای آن کاربر میسازد و آن را در Session State Provider ذخیره میکند.</p>
<p>کاربر تقاضای یک سری اطلاعات با Session ID انحصاری از سرور میکند.</p>
<p>سرور درون Session Provider جستجو میکند و داده های مرتب شده از State Server را دریافت میکند و اشیا را تعیین نوع میکند.</p>
<p>به فلوچارت تصویری زیر نگاهی بیاندازید :</p>
<p>Session in ASP.Net</p>
<p>Fig:ارتباط بین کاربر , Web ServerوStateProvider</p>
<p>منبع :</p>
<p>http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx</p>
<p>Mode Session و State Provider<br />
در ASP.Net مود های زیر موجود است :</p>
<p>InProc</p>
<p>StateServer</p>
<p>SQLServer</p>
<p>Custom</p>
<p>به ازای هر Session State یک Session Provider وجود دارد. دیاگرام زیر نحوه ی ارتباط آنها را نشان میدهد:</p>
<p>Session in ASP.Net</p>
<p>Fig: معماریSession State</p>
<p>میتوانیم Session State Provider را بر اساس Session State ای که انتخاب میکنیم , گزینش کنیم.</p>
<p>زمانی که ASP.Net تقاضای دریافت اطلاعات بر اساس Session ID را میکند , Session State و Provider مربوطه مسئول ارسال اطلاعات صحیح میشوند. جدول زیر Session Mode ها را همراه با نام Provider آنها نشان میدهد :</p>
<p>Session State Mode – State Provider</p>
<p>InProc – In-memory object</p>
<p>StateServer – Aspnet_state.exe</p>
<p>SQLServer – Database</p>
<p>Custom – Custome provider</p>
<p>جدا از آن مود دیگری بنام Off وجود دارد. اگر این گزینه را انتخاب کنیم Session برای برنامه غیرفعال خواهد شد. اما هدف ما استفاده از Session است پس تنها به 4 مود Session State بالا نگاه می اندازیم:</p>
<p>Session State<br />
اساسا Session State به معنای تمام تنظیماتی است که شما برای برنامه وب تان برای حفط Session وارد کرده اید. Session State خودش به تنهایی چیز بزرگی است. درباره ی پیکربندی همه ی Session هایتان است چه در web.config و چه از code-behind. در web.config , المان های برای تنظیم کردن پیکربندی Session بکار میرود. برخی از آنها Mode , Timeout , StateConnectionString , CustomProvider و غیره میباشد. من در رابطه هر بخش از رشته ی اتصال صحبت کرده ام. قبل از صحبت در رابطه با Session Mode نگاهی بیاندازیم به رویداد های Session.</p>
<p>رویداد های Session<br />
دو نوع رویداد Session در ASP.Net وجود دارد:</p>
<p>Session_Start</p>
<p>Session_End</p>
<p>میتوانید هردو رویداد را در فایل global.aspx برنامه ی وب تان کنترل کنید. هرگاه Session جدیدی آغاز شد رویداد Session_Start فعال میشود و رویداد Session_End زمانی فعال میشود که Session ترک یا منقضی شود.</p>
<p>منبع:</p>
<p>http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/iisbook/c06_application_and_session_events.mspx?mfr=true</p>
<p>Session Mode<br />
پیش تر درباره ی Session Mode ها در ASP.Net صحبت کردم. در زیر انواع مختلف Session Mode های موجود در ASP.Net آورده شده است:</p>
<p>Off</p>
<p>InProc</p>
<p>StateServer</p>
<p>SQLServer</p>
<p>Custom</p>
<p>اگر Session را بر روی Mode=”off” در web.config قرار دهیم , Session در برنامه غیرفعال میشود. برای این کار نیاز به پیکربندی web.config مانند زیر داریم:</p>
<p>Session in ASP.Net</p>
<p>Mode InProc Session<br />
این یک Mode Session پیش فرض در ASP.Net میباشد. اطلاعات Session را در دامنه ی برنامه ی کنونی ذخیره میکند. این بهترین Mode Session برای اجرای برنامه های وب میباشد. اما عیب اصلی این است که داده ها را درصورت راه اندازی مجدد سرور از دست میدهد. تعداد دیگری معایب و محاسن در InProc Session Mode وجود دارد. جلوتر به آنها میپردازیم.</p>
<p>دیدگاهی بر InProc Session Mode<br />
همانطور که قبلا گفتم در InProc Mode داده های Session بر روی دامنه ی همان برنامه ذخیره میشوند. پس به آسانی و سرعت در دسترس هستند.</p>
<p>Session in ASP.Net</p>
<p>InProc Session Mode داده های Session اش را در یک شئ حافظه بر روی دامنه ی برنامه ذخیره میکند. این کار توسط یک پردازش کارگر در application pool انجام میشود. پس اگر ما سرور را مجددا راه اندازی کنیم داده های Session را از دست خواهیم داد. اگر کاربر تقاضای دریافت داده کند , State Provider داده را از یک شئ حافظه داخلی میخواند و آن را به مشتری برمیگرداند. در web.config ما باید Session Mode را ذکر کنیم و همچنین Timeout را نیز تنظیم کنیم.</p>
<p>Session in ASP.Net</p>
<p>تنظیمات Session Timeout بالا Session را برای 30 دقیقه پابرجا نگه میدارد. این قابل تغییر از قسمت code-behind نیز است.</p>
<p>Session.TimeOut=30;</p>
<p>دو نوع رویداد Session در ASP.Net وجود دارد: Session_Start() و Session_End() و این تنها مودی است که از رویداد Session_End پشتیبانی میکند. این رویداد پس از آنکه TimeOut به پایان رسید فراخوانی میشود. فلوچارت عمومی برای IncProc Session به صورت زیر خواهد بود:</p>
<p>Session in ASP.Net</p>
<p>هرگاه Session_End() فراخوانی شد بر اساس Session timeout خواهد بود. این یک مکانیزم بسیار سریع است زیرا هیچ مرتب سازی برای ذخیره سازی و دریافت داده رخ نمیدهد و داده داخل همان دامنه ی برنامه باقی میماند.</p>
<p>چه زمانی باید از InProc Session Mode استفاده کنیم؟<br />
InProc , Session Mode پیش فرض میباشد. میتواند برای وب سایت ها و جاهایی که استفاده از اعداد کم است بسیار مفید باشد. باید از InProc در Web Garden Scenario دوری کرد ( به این مورد جلوتر خواهیم پرداخت)</p>
<p>مزایا و معایب<br />
مزایا:<br />
داده های Session را در یک شئ حافظه در دامنه ی برنامه ی موجود ذخیره میکند. از این رو دسترسی به داده ها بسیار سریع است و داده ها به راحتی در دسترس خواهند بود.</p>
<p>احتیاجی به مرتب سازی برای ذخیره داده در InProc Session Mode نیست.</p>
<p>سرعت اجرا بسیار بالاست. همانند استفاده از ViewState.</p>
<p>معایب:<br />
با وجود اینکه InProc Session سریع ترین و معمول ترین و مکانیزم پیش فرض است , محدودیت های فراوانی دارد:</p>
<p>اگر پردازش کارگر یا دامنه ی برنامه پاک شود , همه ی داده های Session از بین خواهند رفت.</p>
<p>این که این سریع ترین راه است به این معناست که داده های Session بیشتر و کاربران بیشتری میتوانند بر اجرای آن تاثییر بگذارند به خاطر استفاده از حافظه.</p>
<p>نمیتوانیم از آن در Web Garden Scenario استفاده کنیم.</p>
<p>این Session Mode برای web farm scenarios مناسب نیست.</p>
<p>همانطور که در بحث بالا گفته شد , میتوان نتیجه گیری کرد که InProc یک Session با مکانیزم ذخیره سازی بسیار سریع است اما تنها برای برنامه های وب کوچک مناسب است. داده های InProc Session در صورت راه اندازی مجدد سرور یا پاک کردن دامنه ی برنامه از بین میروند و همچنین برای سناریو های Web Farm و Web Garden مناسب نمیباشد.</p>
<p>حال نگاهی میاندازیم به گزینه ای برای حل این مشکلات. ابتدا با StateServer mode شروع میکنیم.</p>
<p>StateServer Session Mode<br />
دیدگاهی بر StateServer Session mode<br />
این همچنین با نام Out-Proc Session mode نیز شناخته میشود. StateServer از یک سرویس پنجره ی مستقل استفاده میکند که مستقل از IIS است و همچنین میتواند بر روی یک سرور مجزا اجرا شود. این Session State کاملا توسط aspnet_state.exe مدیریت میشود. این سرور ممکن است بر روی سیستمی مشابه اجرا شود اما خارج از دامنه ی برنامه ی اصلی جایی که برنامه ی وب شما در حال اجراست. این به آن معناست که اگر شما پردازش ASP.Net خود را مجددا راه اندازی نمایید , داده های Session شما همچنان وجود خواهند داشت. این روش چندین عیب دارد که ناشی از overhead شدن شامل مرتب سازی و به هم ریختن است. همچنین هزینه ی دسترسی داده ها را افزایش میدهد زیرا هربار که کاربر داده های Session را دریافت میکند برنامه ی ما پردازش متفاوتی را انجام میدهد.</p>
<p>Session in ASP.Net</p>
<p>پیکربندی برای StateServer Session Mode<br />
در StateServer mode داده های Session در سرور هایی مجزا ذخیره میشود که مجزا از IIS است و توسط aspnet_state.exe کنترل میشود. این پردازش به عنوان یک سرویس پنجره اجرا میشود. شما میتوانید این سرویس را از پنجره های MMC یا از command prompt اجرا کنید.</p>
<p>Session in ASP.Net</p>
<p>به طور پیش فرض “Startup Type” در ASP.Net , state service بر روی دستی تنطیم شده است ; باید آن را بر روی اتوماتیک تنظیم کنیم.</p>
<p>Session in ASP.Net</p>
<p>از قسمت command prompt تنها تایپ کنید “net start aspnet_state”. به طور پیش فرض این سرویس به TCP پورت 42424 گوش میدهد. اما میتوانیم پورت آن را از قسمت Registry editor همانطور که در شکل زیر نشان داده شده است تغییر دهیم :</p>
<p>Session in ASP.Net</p>
<p>حال نگاهی به پیکربندی web.config برای تنظیمات StateServer بیاندازید. برای تنظیمات StateServer ما نیاز داریم تا stateConnectingString را مشخص کنیم. این به سیستم میفهماند که در حال اجرای state server است.به طور پیش فرض stateConnectingString از IP 127.0.0.1 و پورت 42424 استفاده میکند.</p>
<p>Session in ASP.Net</p>
<p>زمانی که ما در حال استفاده از state server هستیم , میتوانیم پیکربندی خصوصیت stateNetworkTimeOut را برای مشخص کردن حداکثر زمان اتنظار برای پاسخ گویی سرویس قبل از کنسل کردن درخواست را انجام دهیم. مقدار timeout به صورت پیش فرض 10 ثنیه است.</p>
<p>Session in ASP.Net</p>
<p>برای استفاده از StateServer اشیایی که ما میخواهیم ذخیره کنیم باید مرتب شده باشند و در زمان دریافت باید آن را به صورت غیر مرتب برگردانیم. من این کار را با یک مثال در زیر توصیف کرده ام.</p>
<p>چگونه StateServer Session Mode کار میکند؟<br />
ما از StateServer Session استفاده میکنیم که تا حد ممکن جلوی از دست رفتن داده های غیرضروری Session را در هنگام راه اندازی مجدد وب سرورمان بگیریم. StateServer توسط aspnet_state.exe حفظ میشود و به عنوان یک پنجره ی سرویس پردازش میشود. این پردازش تمام داده های Session را حفظ میکند. اما در StateServer Session Mode نیاز داریم که داده ها را پیش از ذخیره سازی مرتب کنیم.</p>
<p>Session in ASP.Net</p>
<p>همانطور که در شکل بالا میبینید زمانی که کاربر یک درخوایت به سرور میفرستد , وب سرور داده ی Session را در بر روی state server ذخیره میکند. StateServer ممکن است همین سیستم باشد یا سیستم دسگری. اما کاملا مجزا از IIS است. مقصد StateServer به تنظیمات web.config StateConnectionString بستگی دارد. اگر ما آن را بر روی 127.0.0.1:42424 تنظیم کنیم , خودش داده ها را در یک سیستم محلی ذخیره میکند. برای تغییر مقصد StateServer نیاز به تغییر IP داریم و مطمئن باشید که aspnet_state.exe در حال اجرا بر روی سیستمتان باشد.در غیر اینصورت در هنگام ذخیره ی داده بر روی Session با خطای زیر رو به رو خواهید شد.</p>
<p>Session in ASP.Net</p>
<p>زمانی که ما در حال ذخیره ی یک شئ در Session هستیم , باید مرتب شده باشد. آن داده در StateServer system با استفاده از State Provider ذخیره میشود و در زمان دریافت داده , State Provider داده را بازمیگرداند. فلو چارت کامل آن در زیر آمده است :</p>
<p>Session in ASP.Net</p>
<p>مثالی از StateServer Session Mode<br />
در اینجا مثالی ساده با استفاده از StateServer session mode آورده شده است. من این نمونه برنامه ی وب را مستقیما بر روی IIS ساخنه ام که به ما در فهم استفاده از آن کمک میکند.</p>
<p>گام اول :</p>
<p>ویژوال استودیو را باز کنید. موقعیتی به عنوان HTTP انتخاب کنید و برنامه ی وب را بسازید.</p>
<p>Session in ASP.Net</p>
<p>حال اگر IIS را باز کردید میتوانید یک دایرکتوری مجازی تحت نام برنامه ی وب خودتان بسازید. برای من StateServer است.</p>
<p>Session in ASP.Net</p>
<p>گام دوم :</p>
<p>ساخت یک رابط کاربری ساده که شماره ی roll و نام یک دانش آموز را میگیرد. ما نام و شماره roll را در یک state server Session ذخیره میکنیم. همچنین من یک کلاس بنام StudentInfo ساخته ام. این کلاس در زیر آمده است:</p>
<p>1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
24<br />
25<br />
26<br />
27<br />
28<br />
29<br />
30<br />
31<br />
32<br />
33<br />
34<br />
35<br />
36<br />
37<br />
38<br />
39<br />
40<br />
41<br />
42<br />
43<br />
44<br />
45<br />
[Serializable]
public class StudentInfo<br />
{<br />
//Default Constructor<br />
public StudentInfo()<br />
{</p>
<p>}<br />
///</p>
<p>/// Create object of student Class<br />
///</p>
<p>///Int RollNumber ///String Name public StudentInfo(int intRoll, string strName)<br />
{<br />
this.Roll = intRoll;<br />
this.Name = strName;<br />
}</p>
<p>private int intRoll;<br />
private string strName;<br />
public int Roll<br />
{<br />
get<br />
{<br />
return intRoll;<br />
}<br />
set<br />
{<br />
intRoll = value;<br />
}<br />
}</p>
<p>public string Name<br />
{<br />
get<br />
{<br />
return strName;<br />
}<br />
set<br />
{<br />
strName = value;<br />
}<br />
}<br />
}</p>
<p>Show more<br />
حال نگاهی بیاندازید به قسمت code-behind. من دو button افزوده ام : یکی برای ذخیره ی Session و دیگری برای Session.</p>
<p>1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
protected void btnSubmit_Click(object sender, EventArgs e)<br />
{<br />
StudentInfo _objStudentInfo =<br />
new StudentInfo(Int32.Parse( txtRoll.Text) ,txtUserName.Text);<br />
Session[&#8220;objStudentInfo&#8221;] = _objStudentInfo;<br />
ResetField();<br />
}<br />
protected void btnRestore_Click(object sender, EventArgs e)<br />
{<br />
StudentInfo _objStudentInfo = (StudentInfo) Session[&#8220;objStudentInfo&#8221;];<br />
txtRoll.Text = _objStudentInfo.Roll.ToString();<br />
txtUserName.Text = _objStudentInfo.Name;<br />
}</p>
<p>Show more<br />
گام سوم :</p>
<p>پیکربندی web.config برای state server را همانطور که قبلا توضیح داده ام انجام دهید و لطفا مطمئن باشید که aspnet_state.exe در حال اجرا بر روی سرور پیکربندی شده باشد.</p>
<p>گام چهارم :</p>
<p>برنامه را اجرا کنید.</p>
<p>Session in ASP.Net</p>
<p>داده را وارد کنید و بر روی ثبت کلیک کنید.</p>
<p>چندین تست وجود دارد که من درست کرده ام که کاملا درباره مفید بودن StateServer توضیح داده ام.</p>
<p>نکته 1 : کلمه ی کلیدی [Serializable] را از کلاس StudentInfo پاک کنید و سعی به لجرا برنامه کنید. اگر بر روی دکمه ی ثبت کلیک کنید با خطای زیر رو به رو خواهید شد :</p>
<p>Session in ASP.Net</p>
<p>که به طور واضحی میگوید که که شما باید پیش از ذخیره اشیا آن ها را مرتب سازی نمایید.</p>
<p>نکته 2 : برنامه را اجرا کنید. داده را با کلیک بر روی ثبت ذخیره نمایید . IIS را مجددا راه اندازی نمایید.</p>
<p>Session in ASP.Net</p>
<p>در بخش InProc شما در حال حاضر داده هایتان را از دست داده بودید اما با StateServer با کلیک بر روی بازیابی Session داده های اصلی را دریافت میکنید زیرا داده های State Server به IIS بستگی ندارد. آن را به صورت مجزا نگهداری میکند.</p>
<p>نکته 3 : aspnet_state.exe را از پنجره ی سرویس MMC متوقف کنید و داده را ذخیره نمایید. خطای زیر را دریافت خواهید کرد :</p>
<p>Session in ASP.Net</p>
<p>زیرا پردازشگر State Server شما در حال اجرا نیست. پس لطفا این سه نکته را هرگاه که در حال استفاده از State Server Mode هستید مد نظر داشته باشید.</p>
<p>مزایا و معایب<br />
بر اساس بحث بالا :</p>
<p>مزایا:<br />
داده ها را جرا از IIS نگهداری میکند. پس هر مشکلی که با IIS پیش بیاید تاثیری بر داده های Session نمیگذارد.</p>
<p>مفید برای استفاده در سناریو های web farm و web garden میباشد.</p>
<p>معایب:<br />
پردازش با توجه به مرتب سازی و به هم ریختن در آن کند است.</p>
<p>State Server باید در همه حال در حال اجرا باشد.</p>
<p>من تا همینجا بر روی State Server متوقف میشوم. اما شما میتوانید نکات جالب بیشتری در بخش هایLoad Balance , Web Farm و Web Garden ببینید.</p>
<p>منبع :</p>
<p>http://msdn.microsoft.com/en-us/library/ms178586.aspx</p>
<p>http://msdn.microsoft.com/en-us/library/ms972429.aspx</p>
<p>SQLServer Session Mode<br />
دیدگاهی بر SQL Server Session Mode<br />
این Session Mode مدیریت Session مطمئن تر با امنیت بالاتری را در ASP.Net ارائه میدهد. در این Session Mode داده های Session به صورت مرتب شده و ذخیره شده در یک پایگاه داده ی SQL Server هستند. عیب اصلی این متد ذخیره سازی Session , همان Overhead مرتبط با داده های مرتب شده و به هم ریخته است. این بهترین گزینه برای استفاده در web farm ها میباشد.</p>
<p>Session in ASP.Net</p>
<p>برای نصب SQL Server به SQl script های زیر احتیاج دارید :</p>
<p>برای نصب : InstallSqlState.sql</p>
<p>برای پاکسازی : UninstallSqlState.sql</p>
<p>آسان ترین راه برای پیکربندی SQL Server استفاده از دستور aspnet_regsql میباشد.</p>
<p>من کاربرد این فایل ها را با جزئیات در بخش پیکربندی توضیح داده ام. این مفیدترین State management در web farm scenarios است.</p>
<p>چه زمانی باید از SQLServer Session Mode استفاده کنیم؟<br />
SQLServer Session Mode یک State Management ایمن تر و مطمئن تر است.</p>
<p>داده ها را در یک موقعیت متمرکز (پایگاه داده) نگهداری میکند.</p>
<p>زمانی که ایمنی Session برایمان مهم باشد باید از SQL Server Session Mode استفاده کنیم.</p>
<p>اگر در جایی هستید که راه اندازی های مجدد سرور رخ میدهد , یک انتخاب ایده آل است.</p>
<p>یک مود عالی برای web farm و web garden است.(جلوتر به طور کامل توضیح خواهم داد)</p>
<p>میتوانیم از SQLServer Session Mode برای زمانی که میخواهیم Session را بین دو برنامه ی متفاوت به اشتراک بگذاریم , استفاده کنیم.</p>
<p>پیکربندی برای SQLServer Session Mode<br />
در SQLServer Session Mode ما داده های Session را در SQL Server ذخیره میکنیم. پس در ابتدا نیاز داریم که رشته ی اتصالی پایگاه داده در web.config ارائه دهیم. خاصیت sqlConnectionString به همین منظور استفاده میشود.</p>
<p>پس از آنکه رشته ی اتصال را برقرار کردیم باید بدنه ی SQL Server را بسازیم. اکنون توضیح میدهم که این کار با استفاده از دستور aspnet_regsql به چه صورت انجام میشود.</p>
<p>گام اول:</p>
<p>از قسمت command prompt به راهنمای نسخه ی framework بروید.</p>
<p>E.g.: c:\windows\microsoft.net\framework\</p>
<p>گام دوم:</p>
<p>دستور aspnet_regsql را با پارامتر های زیر اجرا کنید:</p>
<p>Session in ASP.Net</p>
<p>Parameters</p>
<p>Description</p>
<p>-ssadd Add support for SQLServer mode session state.<br />
-sstype p P stands for Persisted. It persists the session data on the server.<br />
-S Server name.<br />
-U User name.<br />
-P Password.<br />
پس از اجرای دستور پیغام زیر را مشاهده میکنید:</p>
<p>Session in ASP.Net</p>
<p>همین بود.</p>
<p>گام سوم:</p>
<p>SQL Server management Studio را باز کنید و چک کنید که آیا پایگاه داده جدیدی ASPState ساخته شده است و در آن دو جدول وجود خواهد داشت.</p>
<p>ASPStateTempApplications</p>
<p>ASPStateTempSessions</p>
<p>Session in ASP.Net</p>
<p>پیکربندی رشته ی مثال StateServer را تغییر دهید و برنامه ای شبیه آن را اجرا کنید.</p>
<p>تنها شماره ی roll و نام کاربری را ذخیره کنید و بر روی دکمه ی ثبت کلیک کنید. جدول ASPStateTempSessions از SQL Server Management Studio را باز کنید. این هم داده ی Session شما :</p>
<p>Session in ASP.Net</p>
<p>حال تست های زیر که قبلا در بخش StateServer Mode توضیح دادم را انجام دهید.</p>
<p>کلمه ی کلیدی Sereialize را از کلاس StydentInfo حذف کنید.</p>
<p>IIS را مجددا راه اندازی کنید و بر روی بازیابی Session کلیک کنید.</p>
<p>SQLServer Service را متوقف کنید.</p>
<p>به نظرم SQL Server Session Mode را به قدر کافی توضیح دادم.</p>
<p>مزایا و معایب<br />
مزایا:<br />
داده های Session در صورت راه اندازی مجدد IIS تاثیر نمیپذیرد.</p>
<p>مطمئن ترین و ایمن ترین Session Management</p>
<p>داده ها را به صورت متمرکز نگهداری میکند و دسترسی به آن از سایر برنامه ها به آسانی انجام میشود.</p>
<p>در سناریو های web farm و web garden بسیار مفید است</p>
<p>معایب:<br />
پردازش در طبیعت بسیار کند است</p>
<p>مرتب سازی و بر هم زنی اشیا منجر به تولید Overhead در برنامه میشود.</p>
<p>در حالی که داده های Session در سروری متفاوت کنترل میشوند باید از SQL Server نیز مراقبت کنیم. باید همیشه در حال اجرا باشد.</p>
<p>منبع:</p>
<p>http://msdn.microsoft.com/en-us/library/ms178586.aspx</p>
<p>Custome Session Mode<br />
دیدگاهی کلی بر Custom Session Mode<br />
به طور معمول ما از InProc , StateServer یا SQLServer Session برای برنامه هایمان استفاده میکنیم اما نیاز داریم که اصول Custom Session Mode را نیز بدانیم. این Session Mode کمی جالب است زیرا Custom Session به ما کنترل کامل برای استفاده از هرچیزی را میدهد حتی Session ID. میتوانید الگوریتم خودتان را برای تولید Session ID بنویسید.</p>
<p>میتوانید Custom Provider را اجرا کنیدکه داده های Session را در یک مکانیزم ذخیره سازی دیگر به سادگی با استخراج از کلاس SessionStateStoreProviderBase ذخیره نمایید. همچنین میتوانید یک Session ID جدید با اجرای ISessionIDManager تولید کنید.</p>
<p>این متد هایی است که در طول اجرای Custom Session فراخوانی میشود.</p>
<p>Session in ASP.Net</p>
<p>در متد Initialize میتوانیم یک Custom Provider تنظیم کنیم. این مقداردهی اولیه Connection با Provider انجام میدهد. SetItemExpireCallback برای تنظیم کردن SessionTimeOut استفاده میشود. میتوانیم یک متد ثبت کنیم که در زمان منقضی شدن Session فراخوانی میشود. InitializeRequest برای هر درخواست فراخوانی میشود و CreateNewStoreData نیز برای ساخت یک مقدار از SessionStateStoreData استفاده میشود.</p>
<p>چه زمانی باید از Custom Session Mode استفاده کنیم؟<br />
میتوانیم از custom Mode در موارد زیر استفاده کنیم :</p>
<p>زمانی که میخواهیم داده های Session را در جایی غیر از SQL Server ذخیره نماییم.</p>
<p>زمانی که مجبور به استفاده از جدولی موجود برای ذخیره سازی داده های Session باشیم.</p>
<p>زمانی که نیاز به ساخت Session ID خودمان را داریم.</p>
<p>به چه پیکربندی برای استفاده از آن نیاز داریم؟<br />
نیاز داریم که بدنه ی web.config مان را مانند زیر بسازیم :</p>
<p>Session in ASP.Net</p>
<p>اگر بخواهید که در این زمینه بیشتر کاوش کنید میتوانید به قسمت منابع رجوع کنید.</p>
<p>مزایا و معایب<br />
مزایا:<br />
میتوانیم از یک جدول موجود برای ذخیره سازی داده ها در Session استفاده کنیم. این در زمانی که بخواهیم از یک پایگاه داده ی موجود استفاده کنیم , بسیار مفید است.</p>
<p>این به IIS بستگی ندارد. پس راه اندازی مجدد وب سرور تاثیری بر داده های Session ندارد.</p>
<p>میتوانیم الگوریتم خودمان را برای تولید Session ID بسازیم.</p>
<p>معایب:<br />
پردازش داده ها بسیار کند است.</p>
<p>ساختن یک Custom State Provider یک low-level task است که نیاز است با دقت به آن رسیدگی شود تا امنیت آن برقرار شود.</p>
<p>همیشه توصیه میشود که از یک third party provider به جای ساخت توسط خودتان استفاده کنید.</p>
<p>منبع:</p>
<p>http://msdn.microsoft.com/en-us/library/ms178586.aspx</p>
<p>دیدگاهی بر گسترش تولید<br />
محیط تولید جایی است که ما برنامه ی مان را گسترش میدهیم بر یک سرور تولید زنده . این یک چالش بزرگ و اصلی برای web developers برای گسترش برنامه تان بر روی سرور های زنده است زیرا در محیط های تولید بزرگ تعداد زیادی از کاربران وجود دارند و کنترل بارگذاری برای بسیاری از کاربران با یک سرور تنها سخت میباشد. اینجا مفاهیم Web Farm , Load Balance , Web Garden و غیره به میان می آید.</p>
<p>چند ماه پیش من یک برنامه ی وب در محیط تولیدی زنده گسترش دادم که توسط میلیون ها کاربر مورد استفاده قرار گرفت و بیش از 10 Directory instance فعال , بیش از 10 web server در Load Balance و چندین سرور پایگاه داده , سرور تعویض , سرور LCS و غیره در آن وجود داشت. تصویر زیر نشان دهنده ی تولید دیاگرام محیط تولید است.</p>
<p>Session in ASP.Net</p>
<p>من سعی میکنم تا سناریو های متفاوت را که شما نیاز به دانستنشان دارید برایتان بگویم در همان حالی که در حال گسترش برنامه تان هستیم.</p>
<p>Application Pool<br />
این یکی از مهمترین چیز هایی است که باید برای محیط تولید برنامه تان بسازید. Application Pool برای جداسازی سری های IIS worker processes که پیکربندی های مشابه را به اشتراک میگذارد. Application Pool به ما این امکان را میدهد تا برنامه ی وب مان را ایزوله کنیم برای امنیت و اطمینان بیشتر و در دسترس بودن بالاتر. پردازش worker به عنوان پردازش مرزی انجام میشود که Application Pool ها را از یکدیگر جدا میکند تا اگر یکی از پردازش های worker یا برنامه به مشکلی برخورد یا حذف شد برنامه ی دیگر یا پردازش worker تاثیری از آن نگیرند.</p>
<p>Session in ASP.Net</p>
<p>هویت Application Pool<br />
پیکربندی هویت Application Pool یک وجه مهم از امنیت IIS 6.0 و IIS 7.0 است. زیرا هرگاه پردازش به یک منبع دسترسی داشته باشد , هویت پردازش worker را تعیین میکند. در IIS 7.0 سه هویت از پیش تعریف شده که مشابه همان ها در IIS 6.0 نیز هست وجود دارد.</p>
<p>Application Pool Identity Description<br />
LocalSystem Built-in account that has administrative privileges on the server. It can access both local and remote resources. For any kind accessing of server files or resources, we have to set the identity of the application pool to LocalSystem.<br />
LocalServices Built-in account has privileges of an authenticated local user account. It does not have any network access permission.<br />
NetworkServices This is the default identity of Application Pool. NetworkServices has the privileges of an authenticated local user account.<br />
ساخت و اختصاص Application Pool<br />
کنسول IIS را باز کنید بر روی فولدر Application Pool راست کلیک کنید و Create New را برگزینید.</p>
<p>Session in ASP.Net</p>
<p>Application Pool ID را بدهید و بر روی OK کلیک کنید.</p>
<p>Session in ASP.Net</p>
<p>حال بر روی Virtual Directory راست کلیک کنید (من از StateServer web sites استفاده میکنم) و StateServerAppPool را به StateServer Virtual Directory اختصاص دهید.</p>
<p>Session in ASP.Net</p>
<p>پس این StateServer web site به طور مستقل با StateServerAppPool اجرا میشود. هر مشکلی مرتبط با برنامه های دیگر بر روی این برنامه تاثیر نمیگذارد. این مزیت اصلی ساخت Application Pool به صورت مجزا است.</p>
<p>Web Garden<br />
به صورت پیش فرض هر Application Pool با یک پردازش Single worker اجرا میشود (W3Wp.exe). میتوانیم چندین پردازش worker را به یک application Pool اختصاص دهیم. یک Application Pool با چندین پردازش worker , Web Garden نامیده میشود. بسیاری از پردازش های worker با همان Application Pool میتواند گاهی اوقات اجرا های سریعتر با زمان پاسخگویی بهتری ارائه دهد و هر پردازش worker باید thread و فصای حافظه ی خودش را داشته باشد.</p>
<p>Session in ASP.Net</p>
<p>همانطور که در شکل نشان داده شده است در IIS ممکن است چندین Application Pool وجود داشته باشد و هر application pool حداقل یک پردازش worker خواهد داشت. یک web Garden باید شامل چندین پردازش worker باشد.</p>
<p>محدودیت های معینی در استفاده از Web Garden دربرنامه های وب وجود دارد. اگر ما از InProc Session Mode استفاده کنیم , برنامه مان به درستی کار نمیکند زیرا Session توسط یک پردازش worker متفاوت کنترل میشود. برای رفع این مشکل باید از OutProc Session Mode استفاده کنیم و میتوانیم از Session State Server یا SQL Server Session State استفاده کنیم.</p>
<p>مزیت اصلی:<br />
پردازش worker در web garden تقاضا های دریافتی برای یک Application Pool به خصوص را به اشتراک میگذارد. اگر یک پردازش worker ناموفق باشد یک پردازش worker دیگر میتواند آن پردازش نیمه تمام را به پایان برساند.</p>
<p>چگونه یک Web Garden بسازیم؟<br />
بر روی Application Pool راست کلیک کنید و به تب Performance بروید و بخشWeb Garden را تیک بزنید.(مانند شکل) :</p>
<p>Session in ASP.Net</p>
<p>به صورت پیش فرض یکی خواهد بود. فقط آن را به بیشتر از یکی تغییر دهید.</p>
<p>چگونه Session به Web Garden بستگی دارد؟<br />
قبلا توضیح دادم که InProc توسط یک پردازش worker کنترل میشود. داده ها را درون شئ حافظه اش نگهداری میکند. حال اگر ما چندین پردازش worker داشتیم آنگاه بسیار سخت خواهد بود تا Session را کنترل کنیم زیرا هر پردازش worker فضای حافظه ی مربوط به خودش را دارد پس اگر درخواست اول من به WP1 برود و داده های Session مرا نگه دارد و درخواست دوم به WP2 برود. من سعی به دریافت داده های Session میکنم و آن در دسترس نخواهد بود که یک خطا را ارسال خواهد کرد. پس لطفا از Web Garden در InProc Session Mode استفاده نکنید.</p>
<p>میتوانیم از StateServer یا SQL Server Session Mode در Web Garden استفاده کنیم زیرا همانطور که توضیح دادم این دو نوع مود Session بستگی به پردازش worker ندارند. در مثال من همچنین توضیح داده ام که اگر شما IIS را راه اندازی مجدد نمایید همچنان قادر به دسترسی به داده های Session تان هستید.</p>
<p>به طور خلاصه :</p>
<p>Session Mode</p>
<p>Recommended</p>
<p>InProc No<br />
StateServer Yes<br />
SQLServer Yes<br />
Web Farm و Load Balance<br />
این معمول ترین و رایج ترین نظر است که در گسترش محصولات استفاده میشود. این نظرات زمانی میایند که ما از چندین وب سرور برای گسترش برنامه مان استفاده میکنیم. دلیل اصلی استفاده از این ها این است که ما باید بارگذاری را در طول چندین سرور توزیع کنیم. یک Load Balance نیاز است تا توزیع بارگذاری بر روی چندین سرور صورت گیرد.</p>
<p>Session in ASP.Net</p>
<p>اگر نگاهی به دیاگرام بالا بیاندازید , کاربر درخواست آدرس میکند و به یک Load Balance ضربه میزند که تصمیم میگیرد به کدام سرور دسترسی پیدا کند. Load Balance ترافیک را در طول تمام وب سرور های مختلف توزیع میکند.</p>
<p>حال این کار چگونه بر Session تاثیر میگذارد؟</p>
<p>کنترل Session در Web Farm و Load Balance scenarios<br />
کنترل Session یکی از چالش برانگیزترین کار ها در web Farm است.</p>
<p>InProc: در InProc Session Mode داده های Session در یک شئ حافظه ی درونی از پردازش worker ذخیره میشود. هر سرور پردازش worker خود را خواهد داشت و داده های Session را در داخل حافظه خودش نگهداری میکند.</p>
<p>Session in ASP.Net</p>
<p>اگر یکی از سرور های از کار بیفتد و اگر درخواست به سرور دیگری برود , کاربر قادر نخواهد بود تا داده های Session را دریافت کند. پس توصیه نمیشود که از InProc در web farm استفاده نمایید.</p>
<p>StateServer : پیش تر توضیح دادم که State Server چیست و چگونه یک state Server پیکربندی میشود. برای web Farm Scenarios میتوانید به راحتی درک کنید که این چقدر مهم است زیرا تمام داده های Session در یک مکان ذخیره میشوند.</p>
<p>Session in ASP.Net</p>
<p>به یاد داشته باشید در یک web Farm باید مطمئن باشید که شما مشابهی را در همه ی وب سرور هایتان دارید. سایر چیز ها مشابه همان هایی هستند که قبلا توصیف کرده ام. تمام فایل های web.config پیکربندی مشابه (StateConnectionString) برای Session State خواهند داشت.</p>
<p>SQLServer : این یک روش دیگر است و بهترین روشی که میتوانیم در web farm استفاده کنیم. باید ابتدا پایگاه داده را پیکربندی کنیم. گام های مورد نیاز در زیر توضیح داده شده اند.</p>
<p>Session in ASP.Net</p>
<p>همانطور که در شکل بالا مشاهده میکنید تمام داده های web server Session در یک پایگاه داده ی سرور SQL ذخیره میشوند. و به راحتی در دسترس هستند. یک چیز را به خاطر بسپارید. باید اشیا را در هر دو حالت StateServer و SQLServer مرتب کنید اگر یکی از وب سرور ها از کار بیفتد , Load Balance بارگذاری را به سرور های دیگر توزیع میکند و کاربر همچنان قادر خواهد بود تا داده های Session را از سرور بخواند زیرا داد ها در یک سرور پایگاه داده ی متمرکز ذخیره شده اند.</p>
<p>به صورت خلاصه میتوانیم هم از StateServer یا SQLServer برای یک web Farm استفاده کنیم و باید از InProc دوری کنیم.</p>
<p>Session و Cookies<br />
کاربران از Cookies برای کار با Session استفاده میکنند. زیرا کاربران باید Session ID ای مناسب برای ارائه با هر درخواستی داشته باشند. میتوانیم این کار را با روش های زیر انجام دهیم:</p>
<p>استفاده از Cookies<br />
ASP.Net یک Cookie ویژه بنام ASP.NET_SessionId به صورت اتوماتیک هربار یک Session Collection استفاده میشود , میسازد. Session ID در طول Cookie انتقال میابد.</p>
<p>Cookie Munging<br />
برخی از مرورگر های قدیمی از Cookies پشتیبانی نمیکنند یا کاربر ممکن است Cookies را در مرورگر غیرفعال کند. در این مورد ASP.Net , Session ID را در یک آدرس اصلاح شده ی خاص (munged) منتقل میکند.</p>
<p>چگونه Cookie Munging کار میکند؟<br />
زمانی که کاربر درخواست صفحه ای را بر روی یک سرور میکند , سرور Session ID را رمزی میکند و آن را به هر لینک HREF درون صفحه اضافه میکند. زمانی که کاربر بر روی لینکی کلیک میکند , ASP.Net آن Session ID را رمزگشایی میکند و آن را به صفحه ای که کاربر درخواست کرده است پاس میدهد. حال صفحه ی درخواست میتواند مقادیر Session را دریافت کند. همه ی این انفاقات به صورت اتوماتیک اتفاق می افتد اگر ASP.Net تشخیص دهد که مرورگر کاربر از Cookies پشتیبانی نمیکند.</p>
<p>چگونه Cookie Munging را اجرا کنیم؟<br />
برای این کار باید Session State مان را به Cookie-less تبدیل کنیم.</p>
<p>حذف Session<br />
در زیر لیست متد های مورد نیاز برای حذف Session آورده شده است.</p>
<p>Method Description<br />
Session.Remove(strSessionName); Removes an item from the session state collection.<br />
Session.RemoveAll() Removes all items from the session collection.<br />
Session.Clear() Remove all items from session collection. Note: There is no difference between Clear and RemoveAll. RemoveAll() calls Clear() internally.<br />
Session.Abandon() Cancels the current session.<br />
فعال و غیرفعال کردن Session<br />
برای بهینه سازی اجرا میتوانیم Session را فعال یا غیرفعال کنیم زیرا هر صفحه دسترسی صفحه را که شامل برخی اجرا های over head میشود را میخواند و مینویسد.</p>
<p>پس بهتر است که با توجه به نیازمان از Session فعال و غیر فعال در جای جای برنامه به جای Session های همیشه فعال استفاده کنیم. میتوانیم Session ها را با دو روش فعال و غیرفعال کنیم:</p>
<p>Page level</p>
<p>Application level</p>
<p>Page level<br />
میتوانیم Session State را در سطح صفحه با استفاده از خاصیت EnableSessionState در راهنمای Page غیرفعال کنیم.</p>
<p>Session in ASP.Net</p>
<p>این میتواند فعالیت Session را برای آن صفحه ی به خصوص غیرفعال کند.</p>
<p>با همین روش میتوانیم آن را به صورت فقط خواندنی دربیاوریم. این به ما اجازه ی دسترسی به داده های Session را میدهد ولی نمیتوانیم بر روی Session داده ای بنویسیم.</p>
<p>Session in ASP.Net</p>
<p>Application level<br />
میتوانیم Session ها را برای کل برنامه ی وب با استفاده از خصوصیت EnableSessionState در web.config غیرفعال کنیم.</p>
<p>Session in ASP.Net</p>
<p>به صورت عمومی ما از page level استفاده میکنیم زیرا برخی از صفحات ممکن است اصلا نیازی به داده های Session نداشته باشند یا تنها Session های خواندنی باشند.</p>
<p>منابع:</p>
<p>http://support.microsoft.com/kb/306996</p>
<p>جمع بندی<br />
امیدوارم که اکنون شما با Session ها و کاربرد هایشان و چگونه آنها را در web farm ها و غیره وارد کنیم آشنا شده باشید. برای حمع بندی :</p>
<p>InProc Session Provider سریع ترین است زیرا هرچیزی درون حافظه ذخیره میشود. داده های Session در صورت راه اندازی مجدد سرور یا حذف پردازش worker از بین خواهند رفت. میتوانید از آن در برنامه های کوچک وب جایی که تعداد کاربران کم است استفاده کنید. از InProc در web Farm ها استفاده نکنید.</p>
<p>در StateServer session Mode داده های Session توسط aspnet_State.exe حفظ میشوند. داده های Session را در خارج از وب سرور نگه میدارد. پس هر مشکلی با وب سرور تاثیری بر داده های Session نمیگذارد. احتیاج به مرتب سازی داده ها پیش از ذخیره کردنشان دارید. میتوانیم از آن با امنیت در web Farm استفاده نماییم.</p>
<p>میتوانیم از Custom Provider برای سورس های داده ای اختصاصی استفاده کنیم یا وقتی که میخواهیم از یک جدوا موجود برای ذخیره کردن داده ها در Session استفاده کنیم. همچنین میتوانیم یک Session ID منحصر به فرد بسازیم. اما توصیه نمییشود که Custom Provider منحصر به فرد بسازید. توصیه میشود تا از آن برایthird party provider استفاده کنید.</p>
<p>امیدوارم که شما از این مقاله لذت برده باشید. لطفا نظرات و پیشنهادات خود را برای بهتر شدن آن با من در میان بگذارید. باز هم از شما بابت خواندن این مقاله متشکرم!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d9%85%d9%82%d8%a7%d9%84%d9%87-%da%a9%d8%a7%d9%85%d9%84-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-session-%d8%af%d8%b1-asp-net/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>سورس برنامه فیبوناچی به زبان اسمبلی</title>
		<link>https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%81%db%8c%d8%a8%d9%88%d9%86%d8%a7%da%86%db%8c-%d8%a8%d9%87-%d8%b2%d8%a8%d8%a7%d9%86-%d8%a7%d8%b3%d9%85%d8%a8%d9%84%db%8c/</link>
					<comments>https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%81%db%8c%d8%a8%d9%88%d9%86%d8%a7%da%86%db%8c-%d8%a8%d9%87-%d8%b2%d8%a8%d8%a7%d9%86-%d8%a7%d8%b3%d9%85%d8%a8%d9%84%db%8c/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Thu, 03 Oct 2024 08:20:14 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1372</guid>

					<description><![CDATA[A small program that calculates and prints terms of the Fibonacci series ; fibo.asm ; assemble using nasm: ; nasm -o fibo.com -f bin fibo.asm ; ;**************************************************************************** ; Alterable Constant ;**************************************************************************** ; You can adjust this upward but the upper limit is around 150000 terms. ; the limitation is due to the fact that we &#8230;]]></description>
										<content:encoded><![CDATA[<pre>A small program that calculates and prints terms of the Fibonacci series

; fibo.asm
; assemble using nasm:  
; nasm -o fibo.com -f bin fibo.asm
;
;****************************************************************************
; Alterable Constant
;****************************************************************************
; You can adjust this upward but the upper limit is around 150000 terms.
; the limitation is due to the fact that we can only address 64K of memory
; in a DOS com file, and the program is about 211 bytes long and the
; address space starts at 100h.  So that leaves roughly 65000 bytes to
; be shared by the two terms (num1 and num2 at the end of this file).  Since
; they're of equal size, that's about 32500 bytes each, and the 150000th
; term of the Fibonacci sequence is 31349 digits long.
;
    maxTerms    equ 15000    ; number of terms of the series to calculate

;****************************************************************************
; Number digits to use.  This is based on a little bit of tricky math.
; One way to calculate F(n) (i.e. the nth term of the Fibonacci seeries)
; is to use the equation int(phi^n/sqrt(5)) where ^ means exponentiation
; and phi = (1 + sqrt(5))/2, the "golden number" which is a constant about
; equal to 1.618.  To get the number of decimal digits, we just take the
; base ten log of this number.  We can very easily see how to get the
; base phi log of F(n) -- it's just n*lp(phi)+lp(sqrt(5)), where lp means
; a base phi log.  To get the base ten log of this we just divide by the
; base ten log of phi.  If we work through all that math, we get:
;
; digits = terms * log(phi) + log(sqrt(5))/log(phi)
;
; the constants below are slightly high to assure that we always have
; enough room.  As mentioned above the 150000th term has 31349 digits,
; but this formula gives 31351.  Not too much waste there, but I'd be
; a little concerned about the stack!
;
        digits        equ (maxTerms*209+1673)/1000    

; this is just the number of digits for the term counter
    cntDigits   equ 6    ; number of digits for counter

        org     100h            ; this is a DOS com file
;****************************************************************************
;****************************************************************************
main:    
; initializes the two numbers and the counter.  Note that this assumes
; that the counter and num1 and num2 areas are contiguous!
;
    mov    ax,'00'        ; initialize to all ASCII zeroes
    mov    di,counter        ; including the counter
    mov    cx,digits+cntDigits/2    ; two bytes at a time
    cld            ; initialize from low to high memory
    rep    stosw        ; write the data
    inc    ax        ; make sure ASCII zero is in al
    mov    [num1 + digits - 1],al ; last digit is one
    mov    [num2 + digits - 1],al ;
    mov    [counter + cntDigits - 1],al

    jmp    .bottom        ; done with initialization, so begin

.top
    ; add num1 to num2
    mov    di,num1+digits-1
    mov    si,num2+digits-1
    mov    cx,digits    ;
    call    AddNumbers    ; num2 += num1
    mov    bp,num2        ;
    call    PrintLine    ;
    dec    dword [term]    ; decrement loop counter
    jz    .done        ;

    ; add num2 to num1
    mov    di,num2+digits-1
    mov    si,num1+digits-1
    mov    cx,digits    ;
    call    AddNumbers    ; num1 += num2
.bottom
    mov    bp,num1        ;
    call    PrintLine    ;
    dec    dword [term]    ; decrement loop counter
    jnz    .top        ;
.done
    call    CRLF        ; finish off with CRLF
    mov    ax,4c00h    ; terminate
    int    21h        ;


;****************************************************************************
;
; PrintLine
; prints a single line of output containing one term of the
; Fibonacci sequence.  The first few lines look like this:
;
; Fibonacci(1): 1
; Fibonacci(2): 1
; Fibonacci(3): 2
; Fibonacci(4): 3
;
; INPUT:     ds:bp ==&gt; number string, cx = max string length
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx, cx, dx, di
;
;****************************************************************************
PrintLine:
    mov    dx,eol        ; print combined CRLF and msg1
    mov    cx,msg1len+eollen   ;
    call    PrintString    ;

    mov    di,counter    ; print counter
    mov    cx,cntDigits    ;
    call    PrintNumericString

    call    IncrementCount    ; also increment the counter

    mov    dx,msg2        ; print msg2
    mov    cx,msg2len    ;
    call    PrintString    ;
    
    mov    di,bp        ; recall address of number
    mov    cx,digits    ;
    ; deliberately fall through to PrintNumericString

;****************************************************************************
;
; PrintNumericString
; prints the numeric string at DS:DI, suppressing leading zeroes
; max length is CX
;
; INPUT:     ds:di ==&gt; number string, cx = max string length
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx, cx, dx, di
;
;****************************************************************************
PrintNumericString:
    ; first scan for the first non-zero byte
    mov    al,'0'        ; look for ASCII zero
    cld            ; scan from MSD to LSD
    repe    scasb        ;
    mov    dx,di        ; points to one byte after
    dec    dx        ; back up one character
    inc    cx        ;
    ; deliberately fall through to PrintString

;****************************************************************************
;
; PrintString
; prints the string at DS:DX with length CX to stdout
;
; INPUT:     ds:dx ==&gt; string, cx = string length
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx
;
;****************************************************************************
PrintString:
    mov    bx, 1        ; write to stdout
    mov     ah, 040h        ; write to file handle
    int    21h        ; ignore return value
    ret            ;

;****************************************************************************
;
; AddNumbers
; add number 2 at ds:si to number 1 at es:di of width cx
;
;
; INPUT:     es:di ==&gt; number1, ds:si ==&gt; number2, cx= max width
; OUTPUT:    CF set on overflow
; DESTROYED: ax, si, di
;
;****************************************************************************
AddNumbers:
    std            ; go from LSB to MSB
    clc            ;
    pushf            ; save carry flag
.top
    mov    ax,0f0fh    ; convert from ASCII BCD to BCD
    and      al,[si]        ; get next digit of number2 in al
    and    ah,[di]        ; get next digit of number1 in ah
    popf            ; recall carry flag
    adc    al,ah        ; add these digits
    aaa            ; convert to BCD
    pushf            ;
    add    al,'0'        ; convert back to ASCII BCD digit
    stosb            ; save it and increment both counters
    dec    si        ;
    loop    .top        ; keep going until we've got them all
    popf            ; recall carry flag
    ret            ;

;****************************************************************************
;
; IncrementCount
; increments a multidigit term counter by one
;
; INPUT:     none
; OUTPUT:    CF set on overflow
; DESTROYED: ax, cx, di
;
;****************************************************************************
IncrementCount:
    mov    cx,cntDigits    ;
    mov    di,counter+cntDigits-1
    std            ; go from LSB to MSB
    stc            ; this is our increment
    pushf            ; save carry flag
.top
    mov    ax,000fh    ; convert from ASCII BCD to BCD
    and    al,[di]        ; get next digit of counter in al
    popf            ; recall carry flag
    adc    al,ah        ; add these digits
    aaa            ; convert to BCD
    pushf            ;
    add    al,'0'        ; convert back to ASCII BCD digit
    stosb            ; save and increment counter
    loop    .top        ;
    popf            ; recall carry flag
    ret            ;
    
;****************************************************************************
;
; CRLF
; prints carriage return, line feed pair to stdout
;
; INPUT:     none
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx, cx, dx
;
;****************************************************************************
CRLF:    mov    dx,eol        ;
    mov    cx,eollen    ;
    jmp    PrintString    ;

;****************************************************************************
; static data
;****************************************************************************
eol    db  13,10        ; DOS-style end of line
eollen    equ $ - eol

msg1    db  'Fibonacci('    ;
msg1len    equ $ - msg1

msg2    db  '): '        ;
msg2len    equ $ - msg2
;****************************************************************************
; initialized data
;****************************************************************************
term dd maxTerms        ;
;****************************************************************************
; unallocated data
;
; A better way to do this would be to actually ask for a memory
; allocation and use that memory space, but this is a DOS COM file
; and so we are given the entire 64K of space.   Technically, this
; could fail since we *might* be running on a machine which doesn't
; have 64K free.  If you're running on such a memory poor machine,
; my advice would be to not run this program.
;
;****************************************************************************
; static data
counter:            ;
num1 equ counter+cntDigits    ;
num2 equ num1+digits        ;</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%81%db%8c%d8%a8%d9%88%d9%86%d8%a7%da%86%db%8c-%d8%a8%d9%87-%d8%b2%d8%a8%d8%a7%d9%86-%d8%a7%d8%b3%d9%85%d8%a8%d9%84%db%8c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>استفاده از الگوریتم های ژنتیک برای چیدمان مدارهای چاپی</title>
		<link>https://ittutorial.ir/%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-%d9%87%d8%a7%db%8c-%da%98%d9%86%d8%aa%db%8c%da%a9-%d8%a8%d8%b1%d8%a7%db%8c-%da%86%db%8c%d8%af/</link>
					<comments>https://ittutorial.ir/%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-%d9%87%d8%a7%db%8c-%da%98%d9%86%d8%aa%db%8c%da%a9-%d8%a8%d8%b1%d8%a7%db%8c-%da%86%db%8c%d8%af/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Sun, 29 Sep 2024 07:12:42 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1355</guid>

					<description><![CDATA[در این مقاله نشان می دهیم که چگونه برای چیدمان بهینه قسمت های مختلف مدار چاپی از الگوریتم های ژنتیک استفاده کنیم تا کمترین اتصال بین آن ها برقرار باشد. اتصال کمتر بین اجزای مدار به این معنی که از مقاومت ها و خازن های  کمتری استفاده شود. &#160; الگوریتم های ژنتیک شکل ۱ – &#8230;]]></description>
										<content:encoded><![CDATA[<p>در این مقاله نشان می دهیم که چگونه برای چیدمان بهینه قسمت های مختلف مدار چاپی از الگوریتم های ژنتیک استفاده کنیم تا کمترین اتصال بین آن ها برقرار باشد. اتصال کمتر بین اجزای مدار به این معنی که از مقاومت ها و خازن های  کمتری استفاده شود.</p>
<p>&nbsp;</p>
<h2>الگوریتم های ژنتیک</h2>
<p>شکل ۱ – چیدمان رایج اجزای مدار چاپی</p>
<p>نمودار UML این الگوریتم به صورت زیر در WithClass 2000 نشان داده شده است:</p>
<p>&nbsp;</p>
<p>کلاس هایی که الگوریتم ژنتیک را پیاده سازی می کنند شامل کلاس های Population، Gnome و ListGnome می باشد. کلاس Node هر یک از اجزای الکترونیکی روی برد را نمایش می دهد. این کلاس برای مشخص کردن محل قرارگیری اجزا روی مدار چاپی دارای ویژگی های position و size  و ConnectingNode می باشد که تمام اجزای متصل شده را نگه می دارد. Gnomeهای این الگوریتم شامل یک لیست integer می باشد که یک گرید N X N که positionهای مرتبط را نگه می دارد، ارائه می کند. عدد integer اولی گوشه بالا سمت چپ و عدد دوم گوشه پایین سمت راست را مشخص می کند. هر integer می تواند هر عددی باشد که یک position خاص را مشخص می کند. برای مثال، Gnome ای به این شکل: ۱ ۴ ۳ ۵ ۹ ۲ ۷ ۸ ۶ ۱۱ ۱۴ ۱۰ ۱۲ ۱۶ ۱۵ ۱۳ به صورت جدول N X N زیر خواهد بود:</p>
<p>&nbsp;</p>
<p>از متد TranslateNodeSetPositions برای مدیریت انتقال از آرایه به اجزای گرید استفاده می کنیم. متد TranslateNodeSetPositions در کلاس ListGnome اجزای integer آرایه را مانند شکل بالا به مجموعه ای از nodeها مرتبط در یک گرید دو بعدی تبدیل می کند. زمانی که نمایش دو بعدی nodeها را داریم، می توانیم از آن در تابع fitness برای تعیین فاصله بین nodeهای بهم متصل شده استفاده کنیم. با جمع کردن تمام فاصله های اتصال بین گره ها، به یک عدد واحد می رسیم که fitness مربوط به ژن مخصوص ما را مشخص می کند.</p>
<p>متد TranslateNodeSetPositions مربوط به ListGnome به شکل زیر نمایش داده می شود.</p>
<div id="highlighter_406190" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="keyword">public</code><code class="plain">&amp;nbsp;</code><code class="keyword">static</code><code class="plain">&amp;nbsp;</code><code class="keyword">void</code><code class="plain">&amp;nbsp;TranslateNodeSetPositions(ListGenome g)</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="comments">// first we need to translate the Gene array into node positions</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="keyword">int</code><code class="plain">&amp;nbsp;currentX = 0;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="keyword">int</code><code class="plain">&amp;nbsp;currentY = 0;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="keyword">int</code><code class="plain">&amp;nbsp;maxHeight = 0;&amp;nbsp;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="comments">// go through each item in the array and set the node collection in the form</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="comments">// to the relative position represented by the Genome Array</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="keyword">for</code><code class="plain">&amp;nbsp;(</code><code class="keyword">int</code><code class="plain">&amp;nbsp;i = 0; i &amp;lt; Population.kXDimension ; i++)</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="spaces"> </code><code class="keyword">for</code><code class="plain">&amp;nbsp;(</code><code class="keyword">int</code><code class="plain">&amp;nbsp;j = 0; j &amp;lt; Population.kYDimension ; j++)</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>13</code></td>
<td class="content"><code class="spaces"> </code><code class="comments">// set the particular node specified by the Genome Item to the relative position on the 2D grid</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>14</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">Node currentNode = ((Node)Form1.Nodes[(</code><code class="keyword">int</code><code class="plain">)g.TheArray[i*Population.kYDimension + j]]);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>15</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">currentNode.X = currentX;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>16</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">currentNode.Y = currentY;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>17</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">currentX += currentNode.Width + 10;&amp;nbsp;</code><code class="comments">// now advance to next X position</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>18</code></td>
<td class="content"><code class="spaces"> </code><code class="keyword">if</code><code class="plain">&amp;nbsp;(currentNode.Height &amp;gt; maxHeight)</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>19</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">maxHeight = currentNode.Height;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>20</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>21</code></td>
<td class="content"><code class="spaces"> </code><code class="comments">// advance the Y Position</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>22</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">currentY += maxHeight + 10;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>23</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">currentX = 0;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>24</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">maxHeight = 0;&amp;nbsp;</code><code class="comments">// reset max height</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>25</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>26</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>حالا که مجموعه Node Position را داریم، می توانیم براساس فاصله بین nodeهای متصل fitness را محاسبه کنیم. این کار با استفاده از متد CalculateSumNodeDistance مربوط به کلاس ListGnome انجام می شود. این متد همچنین بررسی می کند و nodeهای تکراری که بیش از یک بار در مجموع حساب شده اند، کم می کند. توجه داشته باشید که مجموع بیشتر نشانه fitness ضعیف تر می باشد.</p>
<div id="highlighter_184384" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1" dir="ltr">01 public float CalculateSumNodeDistance()<br />
02<br />
03 {<br />
04<br />
05 TranslateNodeSetPositions(this);<br />
06<br />
07 // Now we can calculate sum of the distances<br />
08<br />
09 long sum = 0;<br />
10<br />
11 foreach (Node n in Form1.Nodes)<br />
12<br />
13 {<br />
14<br />
15 sum += n.SumOfSquareNodeConnections();<br />
16<br />
17 }<br />
18<br />
19 // check for unique nodes<br />
20<br />
21 int[] histogram = new int[Population.kLength];<br />
22<br />
23 foreach (int val in TheArray)<br />
24<br />
25 {<br />
26<br />
27 histogram[val]++;<br />
28<br />
29 }<br />
30<br />
31 foreach (int val in histogram)<br />
32<br />
33 {<br />
34<br />
35 // in any non unique number weight the sum heavily<br />
36<br />
37 if (val &amp;gt; 1)<br />
38<br />
39 sum += sum*val*val;<br />
40<br />
41 }<br />
42<br />
43 // compute the fitness of the Genome by inverting the sum (add a small value so we never get the 0<br />
divisor error)<br />
44<br />
45 return 1/((float)sum + .0001f);<br />
46<br />
47 }</div>
</div>
</div>
<p>اولین مجموعه node ما یک مجموعه ۱۶تایی ساده است که هریک به دیگری متصل شده است:</p>
<div id="highlighter_162937" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1" dir="ltr">01 protected&amp;nbsp;void&amp;nbsp;InitializeNodePopulation0()<br />
02 {<br />
03 // create 16 nodes and add them to the node collection<br />
04 Node node1 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;1&#8221;);<br />
05 Nodes.Add(node1);<br />
06 Node node2 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;2&#8221;);<br />
07 Nodes.Add(node2);<br />
08 Node node3 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;3&#8221;);<br />
09 Nodes.Add(node3);<br />
10 Node node4 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;4&#8221;);<br />
11 Nodes.Add(node4);<br />
12 Node node5 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;5&#8221;);<br />
13 Nodes.Add(node5);<br />
14 Node node6 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;6&#8221;);<br />
15 Nodes.Add(node6);<br />
16 Node node7 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;7&#8221;);<br />
17 Nodes.Add(node7);<br />
18 Node node8 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;8&#8221;);<br />
19 Nodes.Add(node8);<br />
20 Node node9 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;9&#8221;);<br />
21 Nodes.Add(node9);<br />
22 Node node10 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;10&#8221;);<br />
23 Nodes.Add(node10);<br />
24 Node node11 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;11&#8221;);<br />
25 Nodes.Add(node11);<br />
26 Node node12 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;12&#8221;);<br />
27 Nodes.Add(node12);<br />
28 Node node13 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;13&#8221;);<br />
29 Nodes.Add(node13);<br />
30 Node node14 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;14&#8221;);<br />
31 Nodes.Add(node14);<br />
32 Node node15 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;15&#8221;);<br />
33 Nodes.Add(node15);<br />
34 Node node16 =&amp;nbsp;new&amp;nbsp;Node(0, 10, 50, 60, &#8220;16&#8221;);<br />
35 Nodes.Add(node16);&amp;nbsp;<br />
36 // connect the nodes one after another 1&#8211;&amp;gt;2&#8211;&amp;gt;3&#8211;&amp;gt;4&#8212;&amp;gt;5&#8211;&amp;gt;6&#8211;&amp;gt;etc.<br />
37 node1.ConnectNode(node2);<br />
38 node2.ConnectNode(node3);<br />
39 node3.ConnectNode(node4);<br />
40 node4.ConnectNode(node5);<br />
41 node5.ConnectNode(node6);<br />
42 node6.ConnectNode(node7);<br />
43 node7.ConnectNode(node8);<br />
44 node8.ConnectNode(node9);<br />
45 node9.ConnectNode(node10);<br />
46 node10.ConnectNode(node11);<br />
47 node11.ConnectNode(node12);<br />
48 node12.ConnectNode(node13);<br />
49 node13.ConnectNode(node14);<br />
50 node14.ConnectNode(node15);<br />
51 node15.ConnectNode(node16);<br />
52 }</div>
</div>
</div>
<p>زمانی که الگوریتم ژنتیک را اجرا می کنیم و بهترین ژن را پس از ۳۰۰۰ نسل نمایش می دهد، خروجی زیر را مشاهده خواهیم کرد. همان طور که می بینید، سالم ترین Gnome ممکن یک چیدمان node با کمترین فاصله بین nodeهای متصل را تولید می کند.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>اگرچه حالا یک نتیجه مطلوب در اینجا داریم، اما generationها  لزوما همیشه بعد از همگرایی نتیجه مطلوبی ارائه نمی دهند، اما همان طور که در شکل بالا مشاهده می کنید همچنان تا حدودی قابل قبول هستند.</p>
<p>بهترین Gnome بعد از ۳۰۰۰ Generation:</p>
<p>۱۳ ۱۲ ۱۱ ۱۶ ۱ ۱۴ ۱۵ ۱۰ ۲ ۵ ۶ ۹ ۳ ۴ ۷ ۸ –&gt;1.260784E-05</p>
<p>&nbsp;</p>
<p>برای نشان دادن قدرت الگوریتم ژنتیک در چیدمان nodeها، کار را با مقداردهی متفاوت nodeها ادامه می دهیم. سناریوی بعدی همه nodeها را به node مرکزی یعنی شماره ۸ متصل می کند.</p>
<div id="highlighter_690616" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="plain">node1.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node2.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node3.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node4.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node5.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node6.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node7.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node9.ConnectNode(node8);</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>بعد از اجرا برای ۳۰۰۰ Generation، تنظیمات ستاره ای را خواهیم داشت که node مرکزی را به همه nodeهای دیگر متصل کرده است.</p>
<p>بهترین Gnome بعد از ۳۰۰۰ Generation:</p>
<p>۲ ۷ ۱ ۱۰ ۴ ۸ ۳ ۱۲ ۹ ۵ ۶ ۱۵ ۱۶ ۱۴ ۱۳ ۱۱ –&gt;1.960784E-05</p>
<p>&nbsp;</p>
<p>به عنوان آخرین مثال، هر یک از دو node شماره ۱ و ۱۶ را به ۴ node دیگر متصل می کنیم.</p>
<div id="highlighter_634705" class="syntaxhighlighter ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="plain">node1.ConnectNode(node2);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node1.ConnectNode(node3);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node1.ConnectNode(node4);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node1.ConnectNode(node5);&amp;nbsp;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node16.ConnectNode(node12);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node16.ConnectNode(node13);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node16.ConnectNode(node14);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="plain">node16.ConnectNode(node15);</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>این اجرا دو اسپایدر حول دو node گفته شده در صورت مسئله ایجاد می کند.</p>
<p>بهترین Gnome بعد از ۳۰۰۰ Generation:</p>
<p>۹ ۶ ۵ ۸ ۱۱ ۴ ۱ ۳ ۱۵ ۱۶ ۱۲ ۲ ۱۳ ۱۴ ۱۰ ۷ –&gt;2.427185E-05</p>
<p>&nbsp;</p>
<p>نتیجه گیری:</p>
<p>الگوریتم های ژنتیک ابزارهای قدرتمندی برای حل مسائل بهینه سازی هستند. چیدمان اجزای یک برد یک مثال ساده و کاربردی برای نمایش چگونگی استفاده از الگوریتم های ژنتیک می باشد. شما می توانید با اندازه گیری فاصله بین گوشه nodeها به جای فاصله بین مرکز nodeها تابع fitness را بهبود دهید. همچنین می توانید این کار را با nodeهایی با عرض و ارتفاع مختلف مانند IC های بزرگ یا ترانزیستورهای کوچک این کار را انجام دهید. کد استفاده شده در این پروژه هم می تواند با اندکی تغییر برای محیط سه بعدی نیز مورد استفاده قرار بگیرد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-%d9%87%d8%a7%db%8c-%da%98%d9%86%d8%aa%db%8c%da%a9-%d8%a8%d8%b1%d8%a7%db%8c-%da%86%db%8c%d8%af/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>XML Sitemap چگونه به بهبود SEO کمک می کند؟</title>
		<link>https://ittutorial.ir/xml-sitemap-%da%86%da%af%d9%88%d9%86%d9%87-%d8%a8%d9%87-%d8%a8%d9%87%d8%a8%d9%88%d8%af-seo-%da%a9%d9%85%da%a9-%d9%85%db%8c-%da%a9%d9%86%d8%af%d8%9f/</link>
					<comments>https://ittutorial.ir/xml-sitemap-%da%86%da%af%d9%88%d9%86%d9%87-%d8%a8%d9%87-%d8%a8%d9%87%d8%a8%d9%88%d8%af-seo-%da%a9%d9%85%da%a9-%d9%85%db%8c-%da%a9%d9%86%d8%af%d8%9f/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Fri, 27 Sep 2024 21:41:21 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">http://ittutorial.ir/?p=959</guid>

					<description><![CDATA[وقتی که صحبت از SEO و بازاریابی به میان می آید، من راه های سریع و آسان را دوست دارم. اگرچه من متعهد به سفری طولانی در وبلاگ نویسی هستم (بیش از ده سال)، بیشتر ترجیح می دهم چند دکمه را فشار دهم و چند اهرم را بکشم تا ترافیک بیشتری داشته باشم. تلاش کمتر، &#8230;]]></description>
										<content:encoded><![CDATA[<p>وقتی که صحبت از SEO و بازاریابی به میان می آید، من راه های سریع و آسان را دوست دارم. اگرچه من متعهد به سفری طولانی در وبلاگ نویسی هستم (بیش از ده سال)، بیشتر ترجیح می دهم چند دکمه را فشار دهم و چند اهرم را بکشم تا ترافیک بیشتری داشته باشم. تلاش کمتر، برد بیشتر. این چیزی است که می خواهم. و، خوشبختانه، برخی از تکنیک های SEO در قبال تلاش کم ارزش بالایی تولید می کنند. می خواهم یکی از این تکنیک ها را با شما به اشتراک بگذارم: ایجاد نقشه سایت یا xml sitemap.</p>
<p>حالا قبل از اینکه پس از خواندن عبارت «xml sitemap» فرار کنید، چند خبر خوب برای شما دارم. هر چند xml sitemap جنبه فنی SEO در نظر گرفته می شود، کار سختی نیست. در واقع اصلا فنی نیست. برای ایجاد یک xml sitemap  خوب فقط چند دقیقه باید کار کنید. لازم نیست نحوه کدنویسی را بلد باشید. فقط باید نحوه کلیک کردن را بدانید. رایگان است. آسان است. نسبتا ساده است، و به کمک آن می توانید SEO خود را بهبود ببخشید.</p>
<h3>xml sitemap چیست؟</h3>
<p>به عبارت ساده، xml sitemap فهرستی از URL های یک وب سایت است. به همین دلیل نقشه سایت نامیده می شود. این کار ساختار نقشه وب سایت و محتوای آن را نشان می دهد (xml  مخفف « Extensible Markup Languag» است که راهی برای نمایش اطلاعات در وب سایت است.) اما چرا باید xml sitemap داشته باشید؟ هدف از آن چیست؟</p>
<h3>هدف از  xml sitemap چیست؟</h3>
<p>موتورهای جستجو از کرولرها برای سازماندهی و شاخص سازی اطلاعات در وب استفاده می کنند. کرولر می تواند تمام انواع اطلاعات را بخوانند. اما xml sitemap خواندن و شاخص سازی اطلاعات وب سایت را ساده تر می کند. زمانی که این کار انجام شود، وب سایت شما به احتمال قوی تر می تواند به سرعت رتبه خود را بهبود ببخشد. در اصل، xml sitemap به عنوان جدول محتویات وب سایت شما عمل می کند و امکان دریافت و شاخص سازی اطلاعات را به کرولر می دهد.</p>
<p>به این قیاس توجه کنید:</p>
<p>وب سایت خود را به عنوان یک خانه و هر صفحه از آن را به عنوان یک اتاق در نظر بگیرید. xml sitemap همانند نقشه خانه شما است و کار گشتن اتاق ها را برای گوگل ساده تر می کند.</p>
<p>با این حال، یک نقشه سایت سازمان یافته می تواند حتی مزایای بیشتری هم داشته باشد.</p>
<p>نقشه سایت می تواند به روز شدن صفحه، فرکانس به روز رسانی صفحه، اهمیت نسبی صفحات در یک وب سایت، و نحوه یافتن و شاخص سازی محتوایی که در اعماق ساختار سایت قرار دارد را برای موتورهای جستجو مشخص کند.</p>
<p>اطلاعات در یک نقشه سایت بدین صورت به نظر می رسند:</p>
<ul>
<li>محل صفحه در وب سایت (URL آن):  &lt;loc&gt;http://www.example.com/mypage&lt;/loc&gt;</li>
<li>آخرین تغییر صفحه: &lt;lastmod&gt;2013-10-10&lt;/lastmod&gt;</li>
<li>میانگین زمانی تغییر: &lt;changefreq&gt;monthly&lt;/changefreq&gt;</li>
<li>اولویت این صفحه نسبت به صفحات دیگر در سایت:  &lt;priority&gt;1&lt;/priority&gt;</li>
</ul>
<p>این ویژگی ها، به ویژه با توجه به مقدار پیوند غیر مجاز که امروزه برای محتوا رخ می دهد، مهم هستند.</p>
<p>اگر از نقشه سایت استفاده نمی کنید، ممکن است به نظر برسد که وب سایت شما دارای اطلاعات تکراری است که برای SEO شما خوب نیست.</p>
<p>از همه مهمتر، xml sitemap راهی سریع برای ایندکس شدن توسط گوگل است.</p>
<p>همان طور که در ابتدا گفتیم این کار راه بسیار ساده است. بااستفاده از xml sitemap به گوگل می گویید که این سایت من است و می خواهم این صفحات ایندکس شوند. در عرض چند دقیقه، گوگل پاسخ شما را می دهد، به سایت شما وارد می شود و مطالبتان را ایندکس می کند.</p>
<p>اگر از خود می پرسید که آیا واقعا به xml sitemap نیاز دارم؟ باید این همه مشکل به خودم تحمیل کنم؟ باید بگویم که بله!</p>
<p>مزایای زیر را برای xml sitemap در نظر بگیرید:</p>
<ul>
<li>xml sitemap به گوگل می گوید که در سایت شما وارد شود و آن را ایندکس کند.</li>
<li>xml sitemap به گوگل می گوید که وارد چه چیزی در وب سایت شما شود.</li>
<li>xml sitemap نوع اطلاعات درون وبسایت را به گوگل می گوید.</li>
<li>xml sitemap به گوگل می گوید که مطالب چه زمانی به روز می شوند (که باعث رتبه بندی fresh بهتر می شود).</li>
<li>xml sitemap به گوگل می گوید که مطالب هر چند وقت یک بار به روز می شوند.</li>
<li>xml sitemap مقدار اهمیت مطالبتان را به گوگل می گوید.</li>
<li>xml sitemap به وبسایت شما در ایندکس شدن سریع کمک می کند.</li>
<li>xml sitemap به غلبه بر محدودیت لینک های داخلی ضعیف وب سایت کمک می کند.</li>
<li>xml sitemap به غلبه بر چالش عدم وجود نمایه لینک خارجی قوی کمک می کند.</li>
<li>xml sitemap به سایت های بسیار بزرگ به دریافت ایندکس بهتر و سازمان یافته تر کمک می کند.</li>
<li>xml sitemap به گوگل در کرول کردن موثرتر وبسایت کمک می کند.</li>
<li>xml sitemap به گوگل تمام صفحات وب سایت شما را نشان می دهد، حتی اگر در ساختار سایت عمیق باشند و جستجو در آنها به سرعت ممکن نباشد.</li>
</ul>
<p>اگر آماده ایجاد xml sitemap هستید، باید یک فرایند سه مرحله ای را دنبال کنید:</p>
<ul>
<li>ایجاد xml sitemap</li>
<li>اضافه کردن xml sitemap به وب سایت</li>
<li>ارسال xml sitemap به گوگل.</li>
</ul>
<p>ادامه این مقاله به هر یک از این مراحل می پردازد.</p>
<h3>ایجاد XML sitemap</h3>
<p>&nbsp;</p>
<p>صفحات NOINDEX: صفحاتی هستند که حاوی کد HTML در header هستند و به موتورهای جستجو می گویند که این صفحه را در جستجوی ایندکس وارد نکند. اگر توسعه دهنده شما برخی صفحات خاص را به عنوان NOINDEX تنظیم کرده است، احتمالا علت خوبی داشته است. هنگامی که شک دارید، این کادر را علامت نزنید.</p>
<p>Canonicalised: ممکن است بیش از یک URL به یک صفحه از محتوا اشاره داشته باشد. اگر canonicalised را علامت بزنید، به ابزار کرول می گویید که همه URL های یک صفحه را بررسی کند. اگر شک دارید، این قسمت را علامت نزنید.</p>
<p>Paginated URLs: Paginated URLs شامل rel= attributes برای گشتن در محتوای سایت می شود. اگر مراقب نباشید، pagination  می تواند برای SEO خطرناک باشد. توصیه می کنم این قسمت را علامت نزنید.</p>
<p>PDFs: می توانید شمول PDFs را در XML Sitemap مشخص کنید. گوگل هر نوع محتوایی را از جمله PDF ایندکس می کند. توصیه میکنم که فایلهای PDF را در XML Sitemap بگنجانید، زیرا PDF ها برای وبسایت شما مهم هستند و ممکن است کاربران به دنبال اطلاعاتی در آنها باشند.</p>
<p>فراموش نکنید که نقشه سایت برای SEO است. اگر می خواهید کسی صفحه ای را در وب سایت شما بیابد، آن را در نقشه سایت خود قرار دهید.</p>
<h3>نحوه ارسال xml sitemap خود به گوگل:</h3>
<p>برای انجام این کار، باید کنسول جستجوی گوگل (Google Search Console) را به وب سایت خود متصل کنید.</p>
<p>اول، به Google Search Console بروید و وب سایت خود را انتخاب کنید.</p>
<p>از dashboard، بر روی Sitemaps کلیک کنید.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>URL که در آن نقشه سایت خود را ذخیره کرده اید را وارد کنید. از آن جا که یک فایل XML است، باید با xml تمام شود.</p>
<p>&nbsp;</p>
<p>باقی کار بر عهده گوگل است.</p>
<p>نقشه سایت این امکان را به Google میدهد که به سرعت و یکپارچه سایت شما را ایندکس کند و به افزایش رتبه بندی شما کمک کند.</p>
<h3>ایجاد XML sitemap با استفاده از Yoast (صرفا برای کاربران وردپرس):</h3>
<p>Yoast یکی از محبوب ترین پلاگین های SEO برای وردپرس است. Yoast ایجاد و ارسال XML sitemap را آسان می کند.</p>
<p>در ادامه انجام کار را به صورت گام به گام توضیح می دهیم، اما ابتدا به موارد زیر نیاز دارید:</p>
<ul>
<li>
<h4>باید از سایت org. استفاده کنید.</h4>
</li>
<li>
<h4>باید پلاگین Yoast را نصب کرده باشید. (رایگان است.)</h4>
</li>
<li>
<h4>وب سایت شما باید به Google Search Console متصل باشد.</h4>
</li>
</ul>
<p>اکثر وب سایت ها این سه چیز را از قبل دارند. اگر آماده هستید، ادامه دهیم.</p>
<h3>ورود به مدیریت وردپرس خود:</h3>
<p>اول باید مطمئن شوید که پلاگین Yoast برای ایجاد نقشه سایت آماده است. برای این کار، باید تنظیمات پیشرفته Yoast را روشن کنید.</p>
<p>بر روی پلاگین Yoast کلیک کنید.</p>
<p>آیکون « Y» دارد و می گوید SEO. باید در ستون کناری سمت چپ واقع شده باشد.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1183" src="http://ittutorial.ir/wp-content/uploads/2017/06/image27-2.jpg" alt="" width="840" height="762" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image27-2.jpg 840w, https://ittutorial.ir/wp-content/uploads/2017/06/image27-2-300x272.jpg 300w, https://ittutorial.ir/wp-content/uploads/2017/06/image27-2-768x697.jpg 768w" sizes="(max-width: 840px) 100vw, 840px" /></p>
<p>بر روی گزینه dashboard کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1182" src="http://ittutorial.ir/wp-content/uploads/2017/06/image46-1.jpg" alt="" width="374" height="197" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image46-1.jpg 374w, https://ittutorial.ir/wp-content/uploads/2017/06/image46-1-300x158.jpg 300w" sizes="(max-width: 374px) 100vw, 374px" /></p>
<p>سپس بر روی features کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1181" src="http://ittutorial.ir/wp-content/uploads/2017/06/image43-1.jpg" alt="" width="708" height="614" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image43-1.jpg 708w, https://ittutorial.ir/wp-content/uploads/2017/06/image43-1-300x260.jpg 300w" sizes="(max-width: 708px) 100vw, 708px" /></p>
<p>از زبانه های موجود، Advanced settings pages را بیابید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1180" src="http://ittutorial.ir/wp-content/uploads/2017/06/image41-1.jpg" alt="" width="685" height="729" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image41-1.jpg 685w, https://ittutorial.ir/wp-content/uploads/2017/06/image41-1-282x300.jpg 282w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<p>تنظیمات پیشرفته را به enabled تغییر دهید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1179" src="http://ittutorial.ir/wp-content/uploads/2017/06/image48-1.jpg" alt="" width="644" height="159" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image48-1.jpg 644w, https://ittutorial.ir/wp-content/uploads/2017/06/image48-1-300x74.jpg 300w" sizes="(max-width: 644px) 100vw, 644px" /></p>
<p>به پایین بروید و بر روی Save Changes کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1178" src="http://ittutorial.ir/wp-content/uploads/2017/06/image17-3.jpg" alt="" width="647" height="586" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image17-3.jpg 647w, https://ittutorial.ir/wp-content/uploads/2017/06/image17-3-300x272.jpg 300w" sizes="(max-width: 647px) 100vw, 647px" /></p>
<p>پس از این کار باید ببینید که منو Yoast در ستون کناری سمت چپ تغییر کرده است و چند گزینه اضافی در آن وجود دارد.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1177" src="http://ittutorial.ir/wp-content/uploads/2017/06/image36-1.jpg" alt="" width="733" height="453" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image36-1.jpg 733w, https://ittutorial.ir/wp-content/uploads/2017/06/image36-1-300x185.jpg 300w" sizes="(max-width: 733px) 100vw, 733px" /></p>
<p>در منوی Yoast ، بر روی XML sitemaps کلیک کنید.</p>
<p>توجه: در صورتی که منو را نمی بینید، بر روی منوی اصلی Y SEO کلیک کنید تا منوی کشویی باز شود.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1176" src="http://ittutorial.ir/wp-content/uploads/2017/06/image24-2.jpg" alt="" width="612" height="324" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image24-2.jpg 612w, https://ittutorial.ir/wp-content/uploads/2017/06/image24-2-300x159.jpg 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<p>در اینجا می توانید قابلیت XML sitemaps سایت خود را راه اندازی کنید.</p>
<p>در اولین تب، General، می توانید تنظیمات را به صورتی که هست رها کنید. اگر آنها را تغییر دادید بر روی Save changes در پایین کادر کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1175" src="http://ittutorial.ir/wp-content/uploads/2017/06/image15-2.jpg" alt="" width="672" height="639" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image15-2.jpg 672w, https://ittutorial.ir/wp-content/uploads/2017/06/image15-2-300x285.jpg 300w" sizes="(max-width: 672px) 100vw, 672px" /></p>
<p>بر روی User sitemap کلیک کنید.</p>
<p>اگر سایت وردپرس شما نویسندگان متعدد دارد، و می خواهید آدرس آرشیو نویسنده ها ایندکس می شود، می توانید این افزونه را فعال کنید.</p>
<p>البته اگر آن را غیر فعال رها کنید، به قابلیت های کامل نقشه سایت آسیبی نمی رساند.</p>
<p>در این مثال ما آن را disable باقی گذاشتیم، زیرا این سایت وردپرس تنها یک نویسنده دارد.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1174" src="http://ittutorial.ir/wp-content/uploads/2017/06/image26-2.jpg" alt="" width="669" height="510" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image26-2.jpg 669w, https://ittutorial.ir/wp-content/uploads/2017/06/image26-2-300x229.jpg 300w" sizes="(max-width: 669px) 100vw, 669px" /></p>
<p>اگر هر چیزی را تغییر داده اید، بر روی Save changes کلیک کنید.</p>
<p>بر روی Post Types کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1173" src="http://ittutorial.ir/wp-content/uploads/2017/06/image03-3.jpg" alt="" width="675" height="484" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image03-3.jpg 675w, https://ittutorial.ir/wp-content/uploads/2017/06/image03-3-300x215.jpg 300w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p>در این بخش، شما در مورد نوع پستی که باید ایندکس شود تصمیم گیری می کنید. در اغلب موارد، بهتر است هر چیزی (از جمله رسانه) در نقشه سایت گنجانده شود.</p>
<p>اگر می خواهید برخی مطالب خود را پنهان کنید، آن ها را از نقشه سایت خارج کنید.اگر مطمئن نیستید، این کار را انجام ندهید. باز هم بر روی save changes کلیک کنید.</p>
<p>حالا، بر روی Excluded posts کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1172" src="http://ittutorial.ir/wp-content/uploads/2017/06/image01-3.jpg" alt="" width="650" height="448" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image01-3.jpg 650w, https://ittutorial.ir/wp-content/uploads/2017/06/image01-3-300x207.jpg 300w" sizes="(max-width: 650px) 100vw, 650px" /></p>
<p>آیا پستی وجود دارد که می خواهید از نقشه سایت حذف کنید؟ آنها را اینجا اضافه کنید.</p>
<p>به خاطر داشته باشید، حتی اگر یک پست را از نقشه سایت خارج کنید، افراد همچنان می توانند آن را پیدا کنند، به آن دسترسی داشته باشند و گوگل نیز ممکن است آن را ایندکس کند.</p>
<p>اگر هر پستی را به لیست خروج اضافه کرده اید، بر روی save changes کلیک کنید.</p>
<p>در نهایت، بر روی Taxonomies کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1171" src="http://ittutorial.ir/wp-content/uploads/2017/06/image04-3.jpg" alt="" width="649" height="398" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image04-3.jpg 649w, https://ittutorial.ir/wp-content/uploads/2017/06/image04-3-300x184.jpg 300w" sizes="(max-width: 649px) 100vw, 649px" /></p>
<p>به احتمال زیاد، تنظیمات را در اینجا به همان صورت باقی می گذارید. هر چه زبانه های بیشتری در نقشه سایت گنجانده شوند، XML sitemap کامل تر خواهد بود.</p>
<p>خوب، نقشه سایت آماده است! اما اول نگاهی به آن بیاندازید.</p>
<p>دوباره به زبانه General بروید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1170" src="http://ittutorial.ir/wp-content/uploads/2017/06/image14-2.jpg" alt="" width="673" height="534" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image14-2.jpg 673w, https://ittutorial.ir/wp-content/uploads/2017/06/image14-2-300x238.jpg 300w" sizes="(max-width: 673px) 100vw, 673px" /></p>
<p>در زیر عنوان Your XML Sitemap، برای مشاهده XML sitemap کلیک کنید.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1169" src="http://ittutorial.ir/wp-content/uploads/2017/06/image12-2.jpg" alt="" width="667" height="439" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image12-2.jpg 667w, https://ittutorial.ir/wp-content/uploads/2017/06/image12-2-300x197.jpg 300w" sizes="(max-width: 667px) 100vw, 667px" /></p>
<p>هنگامی که آن را باز کنید، به یک صفحه واقعی در سایت خود می روید که ممکن است چیزی شبیه به این تصویر باشد.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1168" src="http://ittutorial.ir/wp-content/uploads/2017/06/image22-2.jpg" alt="" width="714" height="415" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/image22-2.jpg 714w, https://ittutorial.ir/wp-content/uploads/2017/06/image22-2-300x174.jpg 300w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<p>به عنوان یک بخش کوچک اما مهم، آخرین بخش از آن URL  را کپی کنید:  sitemap_index.xml.</p>
<p>حالا وقت آن است که این صفحه را به گوگل ارسال کنید.</p>
<h3>ارسال XML Sitemap به گوگل:</h3>
<h3>نتیجه گیری:</h3>
<p>به تجربه من، XML sitemap مزایای آن در SEO خیلی زیاد است. بنابراین اگر تا به حال این کار را برای سایت خود انجام نداده اید، توصیه می کنیم همین امروز شروع کنید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/xml-sitemap-%da%86%da%af%d9%88%d9%86%d9%87-%d8%a8%d9%87-%d8%a8%d9%87%d8%a8%d9%88%d8%af-seo-%da%a9%d9%85%da%a9-%d9%85%db%8c-%da%a9%d9%86%d8%af%d8%9f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>چگونه در Word نیم فاصله ایجاد کنیم</title>
		<link>https://ittutorial.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-word-%d9%86%db%8c%d9%85-%d9%81%d8%a7%d8%b5%d9%84%d9%87-%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%da%a9%d9%86%db%8c%d9%85/</link>
					<comments>https://ittutorial.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-word-%d9%86%db%8c%d9%85-%d9%81%d8%a7%d8%b5%d9%84%d9%87-%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%da%a9%d9%86%db%8c%d9%85/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Mon, 23 Sep 2024 21:41:05 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">http://ittutorial.ir/?p=941</guid>

					<description><![CDATA[۱ راه اول استفاده از کلید ترکیبی Control+Shift+2 به جای استفاده از کلید Space است. ولی این راه به عنوان یک راه همیشگی اصلا راه خوبی نیست. ۲ برای همین میخواهیم یک کلید ترکیبی جدید در ورد تعریف کنیم که استفاده از نیم فاصله را راحت تر کند. معمولا برای نیم فاصله کلید ترکیبی Control+Space &#8230;]]></description>
										<content:encoded><![CDATA[<h3>۱</h3>
<p>راه اول استفاده از کلید ترکیبی Control+Shift+2 به جای استفاده از کلید Space است. ولی این راه به عنوان یک راه همیشگی اصلا راه خوبی نیست.</p>
<h3>۲</h3>
<p>برای همین میخواهیم یک کلید ترکیبی جدید در ورد تعریف کنیم که استفاده از نیم فاصله را راحت تر کند. معمولا برای نیم فاصله کلید ترکیبی Control+Space انتخاب می شود که ما اینجا همان را یاد می دهیم. ولی شما می توانید به جای آن هر کلید دیگری که راحت تر هستید را انتخاب کنید.</p>
<h3>۳</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1247" src="http://ittutorial.ir/wp-content/uploads/2017/06/word-space-3.jpg" alt="" width="600" height="400" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/word-space-3.jpg 600w, https://ittutorial.ir/wp-content/uploads/2017/06/word-space-3-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><br />
در نرم افزار ورد در نوار ابزار بالا روی بخش Insert کلیک می کنیم.</p>
<h3>۴</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1246" src="http://ittutorial.ir/wp-content/uploads/2017/06/word-space-4.jpg" alt="" width="600" height="400" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/word-space-4.jpg 600w, https://ittutorial.ir/wp-content/uploads/2017/06/word-space-4-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><br />
در نوار مربوط به Insert در انتهای آن به دنبال Symbol بگردید و روی آن کلیک کنید و More symbols را انتخاب نمایید.</p>
<h3>۵</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1245" src="http://ittutorial.ir/wp-content/uploads/2017/06/word-space-5.jpg" alt="" width="600" height="400" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/word-space-5.jpg 600w, https://ittutorial.ir/wp-content/uploads/2017/06/word-space-5-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><br />
حالا پنجره جدیدی باز می شود. در این صفحه روی قسمت Special Characters بروید. در زیر آن روی No-Width Optional Break کلیک کنید. این همان نیم فاصله است که ما می خواهیم یک کلید ترکیبی به آن اختصاص دهیم تا بعدا بتوانیم به راحتی از آن استفاده کنیم.</p>
<h3>۶</h3>
<p><img loading="lazy" class="alignnone size-full wp-image-1244" src="http://ittutorial.ir/wp-content/uploads/2017/06/word-space-6.jpg" alt="" width="600" height="400" srcset="https://ittutorial.ir/wp-content/uploads/2017/06/word-space-6.jpg 600w, https://ittutorial.ir/wp-content/uploads/2017/06/word-space-6-300x200.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /><br />
حالا بر روی دکمه Shortcut Key کلیک کنید تا یک پنجره جدید باز می شود. در این صفحه در قسمت Press new shortcut key کلیک کنید. سپس دکمه Control را نگه داشته و سپس Space را بزنید تا ترکیب Ctrl+Space را به شما نشان دهد. بعد از آن روی دکمه Assign کلیک کنید و در آخر Close را بزنید.</p>
<h3>۷</h3>
<p>خوب الان همه کاری که لازم بود انجام شده است و شما میتوانید در نوشته های خود در جاهایی که لازم می بینید به جای Space از ترکیب Control+Space استفاده کنید تا کلمات دو بخشی شما و یا مثلا فعلهایی که “می” دارند به هم پیوسته و زیباتر به نظر بیایند.</p>
<h6>نکات و هشدارها</h6>
<blockquote><p>این چگونه برای نسخه Word 2013 تهیه شده است. ولی به صورت مشابه برای ورد ۲۰۰۷ و ۲۰۱۰ نیز قابل استفاده است.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-word-%d9%86%db%8c%d9%85-%d9%81%d8%a7%d8%b5%d9%84%d9%87-%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%da%a9%d9%86%db%8c%d9%85/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آپلود فایل به سرور به صورت AJAX</title>
		<link>https://ittutorial.ir/%d8%a2%d9%be%d9%84%d9%88%d8%af-%d9%81%d8%a7%db%8c%d9%84-%d8%a8%d9%87-%d8%b3%d8%b1%d9%88%d8%b1-%d8%a8%d9%87-%d8%b5%d9%88%d8%b1%d8%aa-ajax/</link>
					<comments>https://ittutorial.ir/%d8%a2%d9%be%d9%84%d9%88%d8%af-%d9%81%d8%a7%db%8c%d9%84-%d8%a8%d9%87-%d8%b3%d8%b1%d9%88%d8%b1-%d8%a8%d9%87-%d8%b5%d9%88%d8%b1%d8%aa-ajax/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Tue, 17 Sep 2024 07:13:04 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1358</guid>

					<description><![CDATA[در این مقاله نشان می دهیم که چگونه با استفاده از کنترل AsyncFileupload در Ajax Control Toolkit می توان فایل ها را به صورت آسنکرون آپلود نمود. این مثال کنترل جدید AsyncFileUpload را معرفی می کند، کنترلی که می تواند بدون postback و reload صفحه فایل ها را به صورت آسنکرون آپلود کند. با من &#8230;]]></description>
										<content:encoded><![CDATA[<p>در این مقاله نشان می دهیم که چگونه با استفاده از کنترل AsyncFileupload در Ajax Control Toolkit می توان فایل ها را به صورت آسنکرون آپلود نمود. این مثال کنترل جدید AsyncFileUpload را معرفی می کند، کنترلی که می تواند بدون postback و reload صفحه فایل ها را به صورت آسنکرون آپلود کند. با من همراه باشید …<span id="more-18490"></span></p>
<h2>آپلود فایل به سرور</h2>
<p>دانلود آخرین ورژن AJAX Control Toolkit</p>
<p>برای دانلود آخرین ورژن کتابخانه AJAX Control Toolkit می توانید از لینک زیر استفاده نمایید.</p>
<p><a href="http://www.codeplex.com/AjaxControlToolkit" target="_blank" rel="nofollow noopener">ASP.Net AJAX Control Toolkit</a></p>
<p>اضافه کردن رفرنس به پروژه</p>
<p>بعد از اینکه کتابخانه AJAX Control Toolkit را دانلود کرده و از حالت فشرده خارج کردیم، رفرنس آن را به پروژه اضافه کرده و Build می کنیم.</p>
<p>زمانی که رفرنس را اضافه کردیم، تگ زیر را نیز به Web page خود اضافه می کنیم.</p>
<div id="crayon-57986a0552249569133816" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-57986a0552249569133816-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-57986a0552249569133816-1" class="crayon-line"><span class="crayon-ta">&lt;%</span><span class="crayon-sy">@</span> <span class="crayon-i">Register</span> <span class="crayon-v">Assembly</span><span class="crayon-o">=</span><span class="crayon-s">&#8220;AjaxControlToolkit&#8221;</span> <span class="crayon-v">Namespace</span><span class="crayon-o">=</span><span class="crayon-s">&#8220;AjaxControlToolkit&#8221;</span> <span class="crayon-v">TagPrefix</span><span class="crayon-o">=</span><span class="crayon-s">&#8220;cc1&#8221;</span> <span class="crayon-ta">%&gt;</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>کار با کنترل AsyncFileUpload</p>
<p>بعد از اضافه کردن تگ، می توانیم کنترل AsyncFileUpload را به صورت زیر به صفحه اضافه کنیم.</p>
<div id="crayon-57986a055225e373056856" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-57986a055225e373056856-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-2">2</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-4">4</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-6">6</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-8">8</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-10">10</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-12">12</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055225e373056856-14">14</div>
<div class="crayon-num" data-line="crayon-57986a055225e373056856-15">15</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-57986a055225e373056856-1" class="crayon-line"><span class="crayon-r ">&lt;form </span><span class="crayon-e ">id</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;form1&#8221;</span> <span class="crayon-e ">runat</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;server&#8221;</span><span class="crayon-r ">&gt;</span></div>
<div id="crayon-57986a055225e373056856-2" class="crayon-line crayon-striped-line"><span class="crayon-i ">    </span><span class="crayon-r ">&lt;asp:ScriptManager </span><span class="crayon-e ">ID</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;ScriptManager1&#8221;</span> <span class="crayon-e ">runat</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;server&#8221;</span><span class="crayon-r ">&gt;</span></div>
<div id="crayon-57986a055225e373056856-3" class="crayon-line"><span class="crayon-i ">    </span><span class="crayon-r ">&lt;/asp:ScriptManager&gt;</span></div>
<div id="crayon-57986a055225e373056856-4" class="crayon-line crayon-striped-line"><span class="crayon-i ">    </span><span class="crayon-r ">&lt;cc1:AsyncFileUpload </span><span class="crayon-e ">OnClientUploadError</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;uploadError&#8221;</span></div>
<div id="crayon-57986a055225e373056856-5" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-e ">OnClientUploadComplete</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;uploadComplete&#8221;</span> <span class="crayon-e ">runat</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;server&#8221;</span></div>
<div id="crayon-57986a055225e373056856-6" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-e ">ID</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;AsyncFileUpload1&#8221;</span> <span class="crayon-e ">Width</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;400px&#8221;</span> <span class="crayon-e ">UploaderStyle</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;Modern&#8221;</span></div>
<div id="crayon-57986a055225e373056856-7" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-e ">CompleteBackColor</span> <span class="crayon-o">=</span> <span class="crayon-s ">&#8220;White&#8221;</span></div>
<div id="crayon-57986a055225e373056856-8" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-e ">UploadingBackColor</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;#CCFFFF&#8221;</span><span class="crayon-h">  </span><span class="crayon-e ">ThrobberID</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;imgLoader&#8221;</span></div>
<div id="crayon-57986a055225e373056856-9" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-e ">OnUploadedComplete</span> <span class="crayon-o">=</span> <span class="crayon-s ">&#8220;FileUploadComplete&#8221;</span></div>
<div id="crayon-57986a055225e373056856-10" class="crayon-line crayon-striped-line"><span class="crayon-r ">      /&gt;</span></div>
<div id="crayon-57986a055225e373056856-11" class="crayon-line"><span class="crayon-i ">    </span><span class="crayon-r ">&lt;asp:Image </span><span class="crayon-e ">ID</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;imgLoader&#8221;</span> <span class="crayon-e ">runat</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;server&#8221;</span></div>
<div id="crayon-57986a055225e373056856-12" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-e ">ImageUrl</span> <span class="crayon-o">=</span> <span class="crayon-s ">&#8220;~/images/loader.gif&#8221;</span><span class="crayon-r "> /&gt;</span></div>
<div id="crayon-57986a055225e373056856-13" class="crayon-line"><span class="crayon-i ">    </span><span class="crayon-r ">&lt;br </span><span class="crayon-r ">/&gt;</span></div>
<div id="crayon-57986a055225e373056856-14" class="crayon-line crayon-striped-line"><span class="crayon-i ">   </span><span class="crayon-r ">&lt;asp:Label </span><span class="crayon-e ">ID</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;lblMesg&#8221;</span> <span class="crayon-e ">runat</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;server&#8221;</span> <span class="crayon-e ">Text</span><span class="crayon-o">=</span><span class="crayon-s ">&#8220;&#8221;</span><span class="crayon-r ">&gt;</span><span class="crayon-r ">&lt;/asp:Label&gt;</span></div>
<div id="crayon-57986a055225e373056856-15" class="crayon-line"><span class="crayon-r ">&lt;/form&gt;</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>رویدادهای کنترل AsyncFileUpload</p>
<table>
<tbody>
<tr>
<td width="213">property</td>
<td width="213">نوع</td>
<td width="213">اهمیت</td>
</tr>
<tr>
<td width="213">onClientUploadError</td>
<td width="213">کلاینت</td>
<td width="213">زمانی رخ میدهد که آپلود فایل دچار خطا شود.</td>
</tr>
<tr>
<td width="213">onClientUploadComplete</td>
<td width="213">کلاینت</td>
<td width="213">زمانی رخ میدهد که آپلود فایل با موفقیت انجام شود.</td>
</tr>
<tr>
<td width="213">onUploadComplete</td>
<td width="213">سرور</td>
<td width="213">زمانی رخ میدهد که آپلود فایل با موفقیت انجام شود.</td>
</tr>
</tbody>
</table>
<p>مدیریت رویداد سمت سرور</p>
<p>حال برای رویداد سمت سرور onUploadedcomplete می توانیم به صورت زیر عمل کنیم:</p>
<p>سی شارپ</p>
<div id="crayon-57986a0552269096499321" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-57986a0552269096499321-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a0552269096499321-2">2</div>
<div class="crayon-num" data-line="crayon-57986a0552269096499321-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a0552269096499321-4">4</div>
<div class="crayon-num" data-line="crayon-57986a0552269096499321-5">5</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-57986a0552269096499321-1" class="crayon-line"><span class="crayon-m">protected</span> <span class="crayon-t">void</span> <span class="crayon-e">FileUploadComplete</span><span class="crayon-sy">(</span><span class="crayon-t">object</span> <span class="crayon-v">sender</span><span class="crayon-sy">,</span> <span class="crayon-i">EventArgs</span> <span class="crayon-v">e</span><span class="crayon-sy">)</span></div>
<div id="crayon-57986a0552269096499321-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-57986a0552269096499321-3" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-t">string</span> <span class="crayon-v">filename</span><span class="crayon-h">  </span><span class="crayon-o">=</span> <span class="crayon-v">System</span><span class="crayon-sy">.</span><span class="crayon-v">IO</span><span class="crayon-sy">.</span><span class="crayon-v">Path</span><span class="crayon-sy">.</span><span class="crayon-e">GetFileName</span><span class="crayon-sy">(</span><span class="crayon-v">AsyncFileUpload1</span><span class="crayon-sy">.</span><span class="crayon-v">FileName</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-57986a0552269096499321-4" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-v">AsyncFileUpload1</span><span class="crayon-sy">.</span><span class="crayon-e">SaveAs</span><span class="crayon-sy">(</span><span class="crayon-v">Server</span><span class="crayon-sy">.</span><span class="crayon-e">MapPath</span><span class="crayon-sy">(</span><span class="crayon-s">&#8220;Uploads/&#8221;</span><span class="crayon-sy">)</span> <span class="crayon-o">+</span> <span class="crayon-v">filename</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span><span class="crayon-h">   </span></div>
<div id="crayon-57986a0552269096499321-5" class="crayon-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>VB.Net</p>
<div id="crayon-57986a0552272730064787" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-57986a0552272730064787-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a0552272730064787-2">2</div>
<div class="crayon-num" data-line="crayon-57986a0552272730064787-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a0552272730064787-4">4</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-57986a0552272730064787-1" class="crayon-line"><span class="crayon-e">Protected </span><span class="crayon-t">Sub</span> <span class="crayon-e">FileUploadComplete</span><span class="crayon-sy">(</span><span class="crayon-m">ByVal</span> <span class="crayon-e">sender </span><span class="crayon-r">As</span> <span class="crayon-v">Object</span><span class="crayon-sy">,</span> <span class="crayon-m">ByVal</span> e <span class="crayon-r">As</span> <span class="crayon-v">EventArgs</span><span class="crayon-sy">)</span></div>
<div id="crayon-57986a0552272730064787-2" class="crayon-line crayon-striped-line"><span class="crayon-h">   </span><span class="crayon-r">Dim</span> <span class="crayon-e">filename </span><span class="crayon-r">As</span> <span class="crayon-v">String</span><span class="crayon-o">=</span><span class="crayon-v">System</span><span class="crayon-sy">.</span><span class="crayon-v">IO</span><span class="crayon-sy">.</span><span class="crayon-v">Path</span><span class="crayon-sy">.</span><span class="crayon-e">GetFileName</span><span class="crayon-sy">(</span><span class="crayon-v">AsyncFileUpload1</span><span class="crayon-sy">.</span><span class="crayon-v">FileName</span><span class="crayon-sy">)</span></div>
<div id="crayon-57986a0552272730064787-3" class="crayon-line"><span class="crayon-h">   </span><span class="crayon-v">AsyncFileUpload1</span><span class="crayon-sy">.</span><span class="crayon-e">SaveAs</span><span class="crayon-sy">(</span><span class="crayon-v">Server</span><span class="crayon-sy">.</span><span class="crayon-e">MapPath</span><span class="crayon-sy">(</span><span class="crayon-s">&#8220;Uploads/&#8221;</span><span class="crayon-sy">)</span> <span class="crayon-o">+</span> <span class="crayon-v">filename</span><span class="crayon-sy">)</span></div>
<div id="crayon-57986a0552272730064787-4" class="crayon-line crayon-striped-line"><span class="crayon-st">End</span> <span class="crayon-t">Sub</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>همان طور که مشاهده می کنید، به همان صورت که قبلا در کنترل FileUpload عمل می کردیم فایل را در فولدری با نام Upload در ریشه پروژه ذخیره کردیم.</p>
<p>مدیریت رویدادهای سمت کلاینت</p>
<p>مشابه رویدادهای سمت سرور، می توان رویدادهای سمت کلاینت را نیز به شکل زیر کنترل کرد:</p>
<div id="crayon-57986a055227c384492562" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-57986a055227c384492562-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055227c384492562-2">2</div>
<div class="crayon-num" data-line="crayon-57986a055227c384492562-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055227c384492562-4">4</div>
<div class="crayon-num" data-line="crayon-57986a055227c384492562-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055227c384492562-6">6</div>
<div class="crayon-num" data-line="crayon-57986a055227c384492562-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-57986a055227c384492562-8">8</div>
<div class="crayon-num" data-line="crayon-57986a055227c384492562-9">9</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-57986a055227c384492562-1" class="crayon-line"><span class="crayon-ta">&lt;script </span><span class="crayon-e ">type</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;text/javascript&#8221;</span><span class="crayon-o">&gt;</span></div>
<div id="crayon-57986a055227c384492562-2" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-t">function</span> <span class="crayon-e">uploadComplete</span><span class="crayon-sy">(</span><span class="crayon-v">sender</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span></div>
<div id="crayon-57986a055227c384492562-3" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-sy">$</span><span class="crayon-e">get</span><span class="crayon-sy">(</span><span class="crayon-s">&#8220;&lt;%=lblMesg.ClientID%&gt;&#8221;</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e ">innerHTML</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;آپلود فایل با موفقیت انجام شد&#8221;</span><span class="crayon-sy">;</span></div>
<div id="crayon-57986a055227c384492562-4" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-57986a055227c384492562-5" class="crayon-line"></div>
<div id="crayon-57986a055227c384492562-6" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-t">function</span> <span class="crayon-e">uploadError</span><span class="crayon-sy">(</span><span class="crayon-v">sender</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span></div>
<div id="crayon-57986a055227c384492562-7" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-sy">$</span><span class="crayon-e">get</span><span class="crayon-sy">(</span><span class="crayon-s">&#8220;&lt;%=lblMesg.ClientID%&gt;&#8221;</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e ">innerHTML</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;آپلود فایل با خطا مواجه شد&#8221;</span><span class="crayon-sy">;</span></div>
<div id="crayon-57986a055227c384492562-8" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-57986a055227c384492562-9" class="crayon-line"><span class="crayon-ta">&lt;/script&gt;</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>همان طور که می بینید، تابع uploadcomplete و uploadError را به ترتیب در رویدادهای onClientUploadComplete و onClientUploadError کنترل AsyncFileUpload فراخوانی کردیم.</p>
<p>براساس اینکه آپلود با موفقیت انجام شده یا خیر، رویداد مناسب فراخوانی می شود.</p>
<p>انیمیشن Loading</p>
<p>برای نمایش انیمیشن Loading، در زمان شروع آپلود باید یک کنترل image برای نمایش فایل GIF اضافه کنیم. ID مربوط به کنترل Image را باید با استفاده از ThrobberID property مربوط به کنترل AsyncFileUpload مشخص کنیم.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d8%a2%d9%be%d9%84%d9%88%d8%af-%d9%81%d8%a7%db%8c%d9%84-%d8%a8%d9%87-%d8%b3%d8%b1%d9%88%d8%b1-%d8%a8%d9%87-%d8%b5%d9%88%d8%b1%d8%aa-ajax/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>پیاده سازی الگوریتم RSA با C#</title>
		<link>https://ittutorial.ir/%d9%be%db%8c%d8%a7%d8%af%d9%87-%d8%b3%d8%a7%d8%b2%db%8c-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-rsa-%d8%a8%d8%a7-c/</link>
					<comments>https://ittutorial.ir/%d9%be%db%8c%d8%a7%d8%af%d9%87-%d8%b3%d8%a7%d8%b2%db%8c-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-rsa-%d8%a8%d8%a7-c/#respond</comments>
		
		<dc:creator><![CDATA[مدیریت]]></dc:creator>
		<pubDate>Fri, 13 Sep 2024 07:11:44 +0000</pubDate>
				<category><![CDATA[تکنولوژی / آی تی]]></category>
		<guid isPermaLink="false">https://ittutorial.ir/?p=1361</guid>

					<description><![CDATA[در این مقاله الگوریتم RSA را بررسی کرده و چگونگی پیاده سازی آن با C# را نشان می دهیم.برخی اوقات ما نیاز داریم که اطلاعات خود را ازدید سایر کاربران مخفی کنیم.برای این کار از الگوریتم های رمزنگاری استفاده می کنیم و اطلاعات را رمز می کنیم. الگوریتم های رمزنگاری بسیاری وجود دارد ما در &#8230;]]></description>
										<content:encoded><![CDATA[<p>در این مقاله الگوریتم RSA را بررسی کرده و چگونگی پیاده سازی آن با C# را نشان می دهیم.برخی اوقات ما نیاز داریم که اطلاعات خود را ازدید سایر کاربران مخفی کنیم.برای این کار از الگوریتم های رمزنگاری استفاده می کنیم و اطلاعات را رمز می کنیم. الگوریتم های رمزنگاری بسیاری وجود دارد ما در اینجا الگوریتم Rivest, Shamir, Adleman (RSA) را بررسی خواهیم کرد.</p>
<p>درباره RSA:</p>
<p>RSA یک الگوریتم رمزنگاری می باشد که در سال ۱۹۷۷ توسط Ron Rivest، Adi Shamir، Leonard Adlemanمعرفی شد. این الگوریتم یکی از الگوریتم های رایج رمزنگاری کلید عمومی محسوب می شود.</p>
<p>رمزنگاری کلید عمومی (Public Key Encryption)</p>
<p>همچنین به عنوان رمزنگاری متقارن نیز شناخته می شود. دو کلید استفاده می شوند: کلید عمومی و کلید خصوصی.</p>
<p>کلید عمومی: برای رمز کردن</p>
<p>کلید خصوصی: برای باز کردن، به عنوان secret key نیز شناخته می شود.</p>
<p>&nbsp;</p>
<p>در شکل بالا نحوه کار کلید عمومی نشان داده شده است.</p>
<p>در این تصویر، ۲ کاربر نشان داده شده اند:</p>
<p>ابتدا: فرستنده (کسی که پیامی را با کلید عمومی گیرنده ارسال می کند)</p>
<p>سپس: گیرنده (کسی که با استفاده از کلید خصوصی پیام فرستنده را دریافت می کند)</p>
<p>بنابراین در رمزنگاری کلید عمومی، فرستنده اطلاعات را با استفاده از کلید عمومی گیرنده رمز می کند و از الگوریتم رمزنگاری استفاده می کند که توسط گیرنده مشخص شده است و گیرنده فقط الگوریتم رمزنگاری و کلید عمومی را ارسال می کند.</p>
<p>اما با استفاده از کلید عمومی، اطلاعات فقط می توانند رمز شوند و نمی توان آن ها را رمزگشایی کرد، و اطلاعات فقط با کلید خصوصی که گیرنده دارد رمزگشایی می شوند. بنابراین هیچکس نمی تواند داده ما را هک کند.</p>
<p>به زبان ساده تر:</p>
<p>کلید عمومی: برای همه کسانی که می خواهند اطلاعاتی برای ما ارسال کنند، مشخص است.</p>
<p>کلید خصوصی: فقط خودمان از آن اطلاع داریم، زمانی که فردی اطلاعاتی ارسال می کند که با کلید عمومی ما رمزنگاری شده است، می توانیم با کلید خصوصی خود آن را باز کنیم.</p>
<p>الگوریتم RSA چگونه کار می کند:</p>
<p>هر دو کاربر (گیرنده و فرستنده) یک کلید عمومی و خصوصی تولید می کنند.</p>
<p>فلوچارت زیر، فرایند تولید کلید عمومی و خصوصی را نشان می دهد:</p>
<p>&nbsp;</p>
<p>فلوچارت بالا نشان می دهد که کلید عمومی و خصوصی با استفاده از RSA چگونه تولید می شوند.</p>
<div class="clear"></div>
<div class="divider divider-normal"></div>
<div class="box shadow ">
<div class="box-inner-block">
<p><i class="fa tie-shortcode-boxicon"></i>پیشنهاد میکنم : <a href="https://ittutorial.ir/%d8%b3%d9%88%d8%b1%d8%b3-%d9%be%d8%b1%d9%88%da%98%d9%87-%d8%b1%d9%85%d8%b2%d9%86%da%af%d8%a7%d8%b1%db%8c-%d8%aa%d9%88%d8%b3%d8%b7-cryptography/">سورس پروژه رمزنگاری توسط Cryptography</a></p>
</div>
</div>
<div class="clear"></div>
<div class="divider divider-normal"></div>
<p>&nbsp;</p>
<p>بعد از به دست آوردن کلید عمومی و خصوصی، مهم ترین چیز این است که حالا چگونه با استفاده از RSA اطلاعات را رمزنگاری و سپس رمزگشایی نماییم.</p>
<p>رمزنگاری و رمزگشایی در RSA</p>
<p>&nbsp;</p>
<p>مثالی از  RSA: در ادامه مثالی از RSA به همراه تولید کلید عمومی و خصوصی و رمزنگاری و رمزگشایی را می بینیم.</p>
<p>تولید کلید عمومی و خصوصی:</p>
<p>&nbsp;</p>
<p>رمزنگاری و رمزگشایی:</p>
<p>&nbsp;</p>
<p>چگونه از RSA در برنامه های C# Windows Form استفاده کنیم:</p>
<ol>
<li>ویژوال استودیو را باز کرده و یک پروژه جدید از نوع “Windows Form Application” ایجاد می کنیم.</li>
<li>حال Windows Form را به شکل زیر طراحی می کنیم.</li>
</ol>
<p>&nbsp;</p>
<p>برای این کار به ۳ TextBox برای متن اصلی، متن رمزنگاری شده و رمزگشایی شده و ۲ Button داریم.</p>
<p>حالا برای قسمت کد نویسی:</p>
<p>برای استفاده از الگوریتم RSA در C#، باید فضای نام زیر را به پروژه اضافه کنیم.</p>
<div id="crayon-579330fd8220e404294345" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-579330fd8220e404294345-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-579330fd8220e404294345-1" class="crayon-line"><span class="crayon-st">using</span> <span class="crayon-v">System</span><span class="crayon-sy">.</span><span class="crayon-v">Security</span><span class="crayon-sy">.</span><span class="crayon-v">Cryptography</span><span class="crayon-sy">;</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>حال یک تابع برای رمزنگاری می نویسیم.</p>
<div id="crayon-579330fd8221e830322189" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-2">2</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-4">4</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-6">6</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-8">8</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-10">10</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-12">12</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8221e830322189-14">14</div>
<div class="crayon-num" data-line="crayon-579330fd8221e830322189-15">15</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-579330fd8221e830322189-1" class="crayon-line"><span class="crayon-m">static</span> <span class="crayon-m">public</span> <span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-e">Encryption</span><span class="crayon-sy">(</span><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-v">Data</span><span class="crayon-sy">,</span> <span class="crayon-e">RSAParameters </span><span class="crayon-v">RSAKey</span><span class="crayon-sy">,</span> <span class="crayon-t">bool</span> <span class="crayon-v">DoOAEPPadding</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd8221e830322189-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd8221e830322189-3" class="crayon-line"><span class="crayon-st">try</span></div>
<div id="crayon-579330fd8221e830322189-4" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd8221e830322189-5" class="crayon-line"><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-v">encryptedData</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8221e830322189-6" class="crayon-line crayon-striped-line"><span class="crayon-st">using</span> <span class="crayon-sy">(</span><span class="crayon-e">RSACryptoServiceProvider </span><span class="crayon-v">RSA</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">RSACryptoServiceProvider</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd8221e830322189-7" class="crayon-line"><span class="crayon-h">   </span><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd8221e830322189-8" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-v">RSA</span><span class="crayon-sy">.</span><span class="crayon-e">ImportParameters</span><span class="crayon-sy">(</span><span class="crayon-v">RSAKey</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span><span class="crayon-h">            </span><span class="crayon-v">encryptedData</span> <span class="crayon-o">=</span> <span class="crayon-v">RSA</span><span class="crayon-sy">.</span><span class="crayon-e">Encrypt</span><span class="crayon-sy">(</span><span class="crayon-v">Data</span><span class="crayon-sy">,</span> <span class="crayon-v">DoOAEPPadding</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span><span class="crayon-h">    </span><span class="crayon-sy">}</span><span class="crayon-h">   </span><span class="crayon-st">return</span> <span class="crayon-v">encryptedData</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8221e830322189-9" class="crayon-line"><span class="crayon-sy">}</span></div>
<div id="crayon-579330fd8221e830322189-10" class="crayon-line crayon-striped-line"><span class="crayon-st">catch</span> <span class="crayon-sy">(</span><span class="crayon-i">CryptographicException</span> <span class="crayon-v">e</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd8221e830322189-11" class="crayon-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd8221e830322189-12" class="crayon-line crayon-striped-line"><span class="crayon-v">Console</span><span class="crayon-sy">.</span><span class="crayon-e">WriteLine</span><span class="crayon-sy">(</span><span class="crayon-v">e</span><span class="crayon-sy">.</span><span class="crayon-v">Message</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8221e830322189-13" class="crayon-line"><span class="crayon-st">return</span> <span class="crayon-t">null</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8221e830322189-14" class="crayon-line crayon-striped-line"><span class="crayon-sy">}</span></div>
<div id="crayon-579330fd8221e830322189-15" class="crayon-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>و یک تابع برای رمزگشایی تعریف می نماییم.</p>
<div id="crayon-579330fd82223157568799" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-579330fd82223157568799-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-2">2</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-4">4</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-6">6</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-8">8</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-10">10</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-12">12</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-14">14</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-15">15</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-16">16</div>
<div class="crayon-num" data-line="crayon-579330fd82223157568799-17">17</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82223157568799-18">18</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-579330fd82223157568799-1" class="crayon-line"><span class="crayon-m">static</span> <span class="crayon-m">public</span> <span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-e">Decryption</span><span class="crayon-sy">(</span><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span><span class="crayon-v">Data</span><span class="crayon-sy">,</span> <span class="crayon-e">RSAParameters </span><span class="crayon-v">RSAKey</span><span class="crayon-sy">,</span> <span class="crayon-t">bool</span> <span class="crayon-v">DoOAEPPadding</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd82223157568799-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd82223157568799-3" class="crayon-line"><span class="crayon-st">try</span></div>
<div id="crayon-579330fd82223157568799-4" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd82223157568799-5" class="crayon-line"><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-v">decryptedData</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82223157568799-6" class="crayon-line crayon-striped-line"><span class="crayon-st">using</span> <span class="crayon-sy">(</span><span class="crayon-e">RSACryptoServiceProvider </span><span class="crayon-v">RSA</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">RSACryptoServiceProvider</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd82223157568799-7" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd82223157568799-8" class="crayon-line crayon-striped-line"><span class="crayon-h">     </span><span class="crayon-v">RSA</span><span class="crayon-sy">.</span><span class="crayon-e">ImportParameters</span><span class="crayon-sy">(</span><span class="crayon-v">RSAKey</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82223157568799-9" class="crayon-line"><span class="crayon-h">     </span><span class="crayon-v">decryptedData</span> <span class="crayon-o">=</span> <span class="crayon-v">RSA</span><span class="crayon-sy">.</span><span class="crayon-e">Decrypt</span><span class="crayon-sy">(</span><span class="crayon-v">Data</span><span class="crayon-sy">,</span> <span class="crayon-v">DoOAEPPadding</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82223157568799-10" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-579330fd82223157568799-11" class="crayon-line"><span class="crayon-st">return</span> <span class="crayon-v">decryptedData</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82223157568799-12" class="crayon-line crayon-striped-line"><span class="crayon-sy">}</span></div>
<div id="crayon-579330fd82223157568799-13" class="crayon-line"><span class="crayon-st">catch</span> <span class="crayon-sy">(</span><span class="crayon-i">CryptographicException</span> <span class="crayon-v">e</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd82223157568799-14" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd82223157568799-15" class="crayon-line"><span class="crayon-v">Console</span><span class="crayon-sy">.</span><span class="crayon-e">WriteLine</span><span class="crayon-sy">(</span><span class="crayon-v">e</span><span class="crayon-sy">.</span><span class="crayon-e">ToString</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82223157568799-16" class="crayon-line crayon-striped-line"><span class="crayon-st">return</span> <span class="crayon-t">null</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82223157568799-17" class="crayon-line"><span class="crayon-sy">}</span><span class="crayon-h">        </span></div>
<div id="crayon-579330fd82223157568799-18" class="crayon-line crayon-striped-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>چند متغیر به شکل زیر به کلاس اضافه می کنیم:</p>
<div id="crayon-579330fd82228870452868" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-579330fd82228870452868-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82228870452868-2">2</div>
<div class="crayon-num" data-line="crayon-579330fd82228870452868-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82228870452868-4">4</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-579330fd82228870452868-1" class="crayon-line"><span class="crayon-e">UnicodeEncoding </span><span class="crayon-v">ByteConverter</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">UnicodeEncoding</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82228870452868-2" class="crayon-line crayon-striped-line"><span class="crayon-e">RSACryptoServiceProvider </span><span class="crayon-v">RSA</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">RSACryptoServiceProvider</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82228870452868-3" class="crayon-line"><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-v">plaintext</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82228870452868-4" class="crayon-line crayon-striped-line"><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-v">encryptedtext</span><span class="crayon-sy">;</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>حالا رویداد کلیک رمزنگاری را به صورت زیر مدیریت می کنیم:</p>
<div id="crayon-579330fd8222d360201197" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-579330fd8222d360201197-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8222d360201197-2">2</div>
<div class="crayon-num" data-line="crayon-579330fd8222d360201197-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8222d360201197-4">4</div>
<div class="crayon-num" data-line="crayon-579330fd8222d360201197-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd8222d360201197-6">6</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-579330fd8222d360201197-1" class="crayon-line"><span class="crayon-m">private</span> <span class="crayon-t">void</span> <span class="crayon-e">button1_Click</span><span class="crayon-sy">(</span><span class="crayon-t">object</span> <span class="crayon-v">sender</span><span class="crayon-sy">,</span> <span class="crayon-i">EventArgs</span> <span class="crayon-v">e</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd8222d360201197-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd8222d360201197-3" class="crayon-line"><span class="crayon-v">plaintext</span> <span class="crayon-o">=</span> <span class="crayon-v">ByteConverter</span><span class="crayon-sy">.</span><span class="crayon-e">GetBytes</span><span class="crayon-sy">(</span><span class="crayon-v">txtplain</span><span class="crayon-sy">.</span><span class="crayon-v">Text</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8222d360201197-4" class="crayon-line crayon-striped-line"><span class="crayon-v">encryptedtext</span> <span class="crayon-o">=</span> <span class="crayon-e">Encryption</span><span class="crayon-sy">(</span><span class="crayon-v">plaintext</span><span class="crayon-sy">,</span> <span class="crayon-v">RSA</span><span class="crayon-sy">.</span><span class="crayon-e">ExportParameters</span><span class="crayon-sy">(</span><span class="crayon-t">false</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span> <span class="crayon-t">false</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8222d360201197-5" class="crayon-line"><span class="crayon-v">txtencrypt</span><span class="crayon-sy">.</span><span class="crayon-v">Text</span> <span class="crayon-o">=</span> <span class="crayon-v">ByteConverter</span><span class="crayon-sy">.</span><span class="crayon-e">GetString</span><span class="crayon-sy">(</span><span class="crayon-v">encryptedtext</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd8222d360201197-6" class="crayon-line crayon-striped-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>و سپس رویداد کلیک دکمه رمزگشایی را مدیریت می کنیم.</p>
<div id="crayon-579330fd82232285540524" class="crayon-syntax crayon-theme-github-copy crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-579330fd82232285540524-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82232285540524-2">2</div>
<div class="crayon-num" data-line="crayon-579330fd82232285540524-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-579330fd82232285540524-4">4</div>
<div class="crayon-num" data-line="crayon-579330fd82232285540524-5">5</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-579330fd82232285540524-1" class="crayon-line"><span class="crayon-m">private</span> <span class="crayon-t">void</span> <span class="crayon-e">button2_Click</span><span class="crayon-sy">(</span><span class="crayon-t">object</span> <span class="crayon-v">sender</span><span class="crayon-sy">,</span> <span class="crayon-i">EventArgs</span> <span class="crayon-v">e</span><span class="crayon-sy">)</span></div>
<div id="crayon-579330fd82232285540524-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">{</span></div>
<div id="crayon-579330fd82232285540524-3" class="crayon-line"><span class="crayon-t">byte</span><span class="crayon-sy">[</span><span class="crayon-sy">]</span> <span class="crayon-v">decryptedtex</span> <span class="crayon-o">=</span> <span class="crayon-e">Decryption</span><span class="crayon-sy">(</span><span class="crayon-v">encryptedtext</span><span class="crayon-sy">,</span> <span class="crayon-v">RSA</span><span class="crayon-sy">.</span><span class="crayon-e">ExportParameters</span><span class="crayon-sy">(</span><span class="crayon-t">true</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span> <span class="crayon-t">false</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82232285540524-4" class="crayon-line crayon-striped-line"><span class="crayon-v">txtdecrypt</span><span class="crayon-sy">.</span><span class="crayon-v">Text</span> <span class="crayon-o">=</span> <span class="crayon-v">ByteConverter</span><span class="crayon-sy">.</span><span class="crayon-e">GetString</span><span class="crayon-sy">(</span><span class="crayon-v">decryptedtex</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span></div>
<div id="crayon-579330fd82232285540524-5" class="crayon-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>نتیجه:</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ittutorial.ir/%d9%be%db%8c%d8%a7%d8%af%d9%87-%d8%b3%d8%a7%d8%b2%db%8c-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-rsa-%d8%a8%d8%a7-c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
