Dot net In Blue

یکشنبه، مرداد ۲۲، ۱۳۸۵

باز نویسی آدرس صفحات در asp.net

ویرایش : برای دریافت dll و توضیحات بیشتر به سایت http://urlrewriter.net/ مراجعه فرمایید.

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

http://www.Domain.com/default.aspx?queryString1=AAA&queryString1=BBB

و این AAA و BBB نماینده مقادیری است که با عوض شدن آنها محتوی صفحه عوض میشود . اما اگر ندانید تعجب میکنید وقتی به شما بگویم میتوانید آدرس همین صفحه را به صورت زیر داشته باشید :

http://www.Domain.com/AAA/BBB.aspx

به این کار URL rewriting میگویند که ما آن را به فارسی باز نویسی آدرس صفحات ترجمه کرده ایم . اگر بخواهید به طور متمرکز روی این مبحث کارکنید مطالب بسیار زیادی را باید در این رابطه بدانید که در حوصله این مقاله نمیگنجد . اسکات میچل (Scott Mitchell) در 4GuysFromRolla.com مقاله کاملی دارد که نسخه ای از آن نیز در MSDN آمده است است و در آن کاملا توضیح میدهد که این عمل چگونه صورت میگیرد و بعد از آن چه اتفاتی در سرور می افتد و ... ولی من سعی دارم به شما مختصر و مفید توضیح دهم که چگونه با ریفرنس کردن 2 dll که توسط آقای میچل عرضه شده است میتوانید آدرس صفحات خود را بازنویسی کنید .

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

ابتدا و برای شروع dll ها را از اینجا دانلود کنید . سپس آنها را به عنوان مرجع جدید رد پروژه خود reference کنید (از solution bar روی قسمت references رایت کلیک کنید و add reference را انتخاب کنید و...)

با این کار شما تقریبا تمام کار را انجام داده اید ! میماند اینکه تعریف کنید چه آدرس هایی را به چه آدرس هایی باید تبدیل کرد . فرض کنید کاربر در مرورگر خود آدرس http://www.Domain.com/AAA/BBB.aspx را وارد میکند ، در صورتی که چنین صفحه ای روی سرور شما وجود خارجی ندارد و برنامه شما باید متوجه شود که نمایش صفحه ای با آدرس زیر مد نظر است .

http://www.Domain.com/default.aspx?queryString1=AAA&queryString1=BBB

برای این کار کافی است از رگولار اکسپرشن (Regular Expression ) استفاده کنیم .نگران نباید حتی اگر از Regular Expression سر در نمی‌آورید در این مقاله به آن اندازه که احتمالا برای این کار نیاز دارید را در ادامه خواهید دید. اگر خواستید کد های زیر را کپی پیست کنید و در وب گانفیگ خود اسنفاده کنید حتما متون فارسی که با رنگ سبز نوشته شده است را حذف کنید . در غیر این صورت به ایراد بر خواهید خورد.

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" /> </configSections> <RewriterConfig> <Rules> <!-- Rules for Blog Content Displayer -->

در قسمت زیر به دنبال صفحه ای به صورت G123456.aspx میگردد ، 123456 حتما باید یک عدد 6 رقمی باشد که همانطور که مشاهده میکنید در کوئری استرینگ به bID نسبت داده شده است .

<RewriterRule> <LookFor>~/G(\d{6}).aspx</LookFor> <SendTo><![CDATA[~/default.aspx?PageID=554&bID=$1]]></SendTo> </RewriterRule>

در قسمت زیر به دنبال صفحه ای به صورت G123456P123456.aspx میگردد ، 123456 حتما باید یک عدد 6 رقمی باشد که همانطور که مشاهده میکنید در کوئری استرینگ به ترتیب به bID , pID نسبت داده شده است .

<RewriterRule> <LookFor>~/G(\d{6})p(\d{6})\.aspx</LookFor> <SendTo><![CDATA[~/page.aspx?PageID=555&bID=$1&pID=$2]]></SendTo> </RewriterRule>

در قسمت زیر به دنبال صفحه ای به صورت G123456P123456.aspx میگردد ، 123456 حتما باید یک عدد 6 رقمی باشد که همانطور که مشاهده میکنید در کوئری استرینگ به ترتیب به bID , pID نسبت داده شده است .

<RewriterRule> <LookFor>~/G(\d{6})A(.*).aspx</LookFor> <SendTo><![CDATA[~/default.aspx?PageID=555&BlogID=$1&Archive=$2]]></SendTo> </RewriterRule>

در قسمت زیر به دنبال صفحه ای به صورت زیر میگردد :

1234/12/12.aspx <RewriterRule> <LookFor>~/(\d{4})/(\d{2})/(\d{2})\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1&amp;month=$2&day=$3</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/(\d{4})/Default\.aspx</LookFor> <SendTo>~/ShowBlogContent.aspx?year=$1</SendTo> </RewriterRule>

چندین مثل بسیار ساده تر نیز آورده شد است

<RewriterRule> <LookFor>~/Products/Default\.aspx</LookFor> <SendTo>~/ListCategories.aspx</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Beverages\.aspx</LookFor> <SendTo>~/default.aspx?CategoryID=1</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Condiments\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=2</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Confections\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=3</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Dairy\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=4</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/GrainsCereals\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=5</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/MeatPoultry\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=6</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Produce\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=7</SendTo> </RewriterRule> <RewriterRule> <LookFor>~/Products/Seafood\.aspx</LookFor> <SendTo>~/ListProductsByCategory.aspx?CategoryID=8</SendTo> </RewriterRule> </Rules> </RewriterConfig> <system.web>

...از اینجا به بعد web.config مانند قبل ادامه پیدا میکند

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

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>

و سپس استفاده از :

<skm:Form id="Form1" method="post" runat="server">

بجای <form runat="server> که همیشه استفاده میشود است .

در این مقاله آموختیم که چگونه با اضافه کردن چند خط در web.config و همینطور ریفرنس کردن 2 dll میتوانیم در asp.net آدرس ها را بازنویسی کنیم .