عنوان:

‫مروری بر قابلیت جدید ASP.NET FriendlyUrls


نویسنده: مجتبی کاویانی
تاریخ: ۱۳۹۱/۱۱/۲۸ ۱۶:۲۵
آدرس: www.dntips.ir
احتمالا به اهمیت بحث SEO و  آدرس‌های تمیز آن آشنا هستید. ASP.NET MVC از همان ابتدا از قابلیت URL Routing پشتیبانی می‌کرد و ASP.NET Web Forms هم از نسخه NET 4.0. این قابلیت را در خود اضافه نمود. با این حال نوشتن Url Routing برای وب سایت‌ها کمی مشکل و در ASP.NET کمتر استفاده می‌شود. علاوه بر آن تغییر آدرس‌های قدیمی با Url Routing بسیار وقت گیر می‌باشد. به همین خاطر تیم توسعه ASP.NET کتابخانه ای با نام Asp.NET FriendlyUrls که فعلا نسخه قبل از نهایی آن منتشر شده است را در اختیار توسعه دهندگان وب سایت‌ها قرار داده‌اند که با حداقل کد نویسی و بدون اضافه نمودن مسیریابی آدرس‌ها، تمام آدرس‌های قدیم و جدید را مطابق استاندارد SEO تغییر می‌دهد.

دریافت و نصب Asp.NET FriendlyUrls از Nuget
در Visual Studio 2012.2 در صورتی که یک پروژه جدید از نوع ASP.NET Web Forms ایجاد نمایید بصورت پیشفرض این کتابخانه نصب شده است. اما می‌توانید با دستور زیر نیز آن را از Nuget دریافت نمایید:
Install-Package Microsoft.AspNet.FriendlyUrls -Pre

پس از نصب، در کلاس Global می‌بایست کتابخانه را فعال نمایید:
public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.EnableFriendlyUrls();
        }
    }
و همچنین در Application_Start
void Application_Start(object sender, EventArgs e)
        {
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
به همین راحتی؛ حال دو صفحه First.aspx و Second.aspx را به پروژه اضافه نمائید و وب سایت را اجرا کنید. بدون نوشتن پسوند aspx به صفحات دسترسی خواهید داشت:

از درون برنامه هم به راحتی می‌توانید صفحات را به همان صورت قبل بدون پسوند صدا بزنید:
Response.Redirect("~\\Second");
دسترسی به پارامترها نیز به صورت قبل امکان پذیر می‌باشد:
Response.Redirect("~\\First?Id=1001");

string Id = Request.QueryString["Id"] as string;
برای آدرس‌های پیشرفته‌تر، 3 متود الحاقی اضافه گردیده است. مثلا اگر آدرس زیر را داشته باشیم
http://localhost:57353/First/Products/NewProduct
  1. ()Request.GetFriendlyUrlFileVirtualPath
    مسیر مجازی فایل را بر می‌گرداند

  2. ()Request.GetFriendlyUrlSegments
    بخش‌های آدرس را بر می‌گرداند

  3. ()Request.GetFriendlyUrlFileExtension
    پسوند فایل آدرس را بر می‌گرداند

کلاس FriendlyUrl دو متود استاتیک و یک خاصیت دارد 

  1. FriendlyUrl.Segments
    شبیه ()Request.GetFriendlyUrlSegments مجموعه بخش‌های آدرس صفحه جاری را بر می‌گرداند 
  2. FriendlyUrl.Resolve 
    آدرس صفحه جاری را بر می‌گرداند 
  3. FriendlyUrl.Href
    امکان ساخت یک آدرس را با استفاده از مسیر مجازی، بخش‌ها و پارامتر‌ها، فراهم می‌نماید

  

در آخر، فضای نام کتابخانه، Microsoft.AspNet.FriendlyUrls می‌باشد.

نظرات

  • مهمان در ۱۳۹۱/۱۱/۳۰ ۱۹:۵۰
    خیلی عالی بود ممنون
  • صابر فتح الهی در ۱۳۹۱/۱۲/۰۲ ۸:۴۸
    دستت درد نکنه مهندس عالی بود، فکر کنم نسخه نهاییش اومده در این لینک
  • م رحمانی در ۱۳۹۱/۱۲/۰۵ ۱۴:۱۶
    وقتی با vs سایت رو run می‌کنم این قابلیت کار می‌کنه، اما وقتی می‌فرستمش روی iis رو سرور واقعی، خطای 404 میده.
    سرچیدم ولی جواب خاصی پیدا نکردم. کمک لطفاً
    • وحید نصیری در ۱۳۹۱/۱۲/۰۵ ۱۴:۲۹
      از چه IIS ایی استفاده می‌کنید؟ اگر IIS 6 است، این مطلب را مطالعه کنید.
      به صورت خلاصه IIS 6 برنامه‌های ASP.NET و صفحات آن‌را بر اساس پسوند آن‌ها پردازش می‌کند. اگر پسوندی ندارند باید IIS را طوری تنظیم کرد که تمام درخواست‌های رسیده را به موتور ASP.NET هدایت کند.
      • م رحمانی در ۱۳۹۱/۱۲/۰۵ ۱۵:۲۲
        ببخشید. باید همونجا می‌گفتم.
        IIS 7.5 روی Windows Server 2008
        • وحید نصیری در ۱۳۹۱/۱۲/۰۵ ۱۷:۵
          - بررسی کنید آیا برنامه شما در IIS7 در حالت classic اجرا می‌شود یا integrated mode . اگر حالت کلاسیک است، همان روش IIS6 که عنوان شد باید طی شود.
          - تنظیم زیر را به web.config برنامه اضافه کنید:

          <system.webServer>
            <modules runAllManagedModulesForAllRequests="true" />
          </system.webServer>
          - این هات فیکس را نصب کنید: (^). البته اگر سرویس پک یک 2008 R2 نصب شده، نیازی به آن نیست.

          • م رحمانی در ۱۳۹۱/۱۲/۰۶ ۱۳:۰
            با نصب اون هات فیکس مشکل رفع شد.
            ممنون آقای نصیری
  • مهمان در ۱۳۹۱/۱۲/۰۹ ۱۸:۵
    چرا وقتی از FriendlyUrl استفاده می‌کنم به ازای هر style یا فایل .js 
    pageload صفحه اجرا میشه؟

    • وحید نصیری در ۱۳۹۱/۱۲/۰۹ ۱۹:۱۸
      می‌تونید مسیرهایی/فایل‌هایی رو که نباید وارد سیستم routing شوند از لیست حذف کنید. در همان متد RegisterRoutes باید تعاریف زیر اضافه شوند (اگر متد IgnoreRoute در دسترس نبود متد Ignore همین کار را انجام می‌دهد):
       routes.IgnoreRoute("*.html|js|css|gif|jpg|jpeg|png|swf");
      • مهمان در ۱۳۹۱/۱۲/۱۰ ۹:۳۴
        سلام کدهایی که فرمودین اضافه کردم
           public static void RegisterRoutes(RouteCollection routes)
                {
                   
                    routes.EnableFriendlyUrls();
                    routes.Ignore("*.html|js|css|gif|jpg|jpeg|png|swf");
                }

        اما باز نشد با اجرای صفحه همچنان به ازای هر فایل js
        page load صفحه اجرا می‌شود 

        • وحید نصیری در ۱۳۹۱/۱۲/۱۰ ۱۰:۲۵
          - برای تعریف صحیح اسکریپت‌ها یا از متد ResolveUrl استفاده کنید:
          <script src='<%= ResolveUrl("~/Scripts/jquery-1.4.1.js")%>' type="text/javascript" />
          و یا روش بهتر استفاده از اسکریپت منیجر است.
          • مهمان در ۱۳۹۱/۱۲/۱۰ ۱۱:۵۳
            خیلی لطف کردین فقط یه سوال دیگه
            فایل‌های js اضافه کردم به اسکریپت منیجر درست شد
            اما فایل css  را چی کار کنم
            • مهمان در ۱۳۹۱/۱۲/۱۲ ۰:۱۹
              تست کنید آیا این سیستم به css ایی که داخل ریشه روت سایت هم هست ایراد می‌گیره؟ اگه الان با js مشکل ندارید علت این است که سیستم فشرده سازی و یکی کردن اون‌ها رو به صورت یک زیر پوشه ارائه نمی‌ده.
              • مهمان در ۱۳۹۱/۱۲/۱۲ ۸:۴۸
                بله من اگر آدرس Css  در پروژه به صورت زیر باشد
                    <link href="css/StyleSheet.css" rel="stylesheet" type="text/css" />
                باز  برای این pageload صفحه را اجرا می‌کند
  • مهمان در ۱۳۹۲/۰۲/۲۱ ۱۷:۱۲
    سلام
    زمانی که از این frinly url  استفاده می‌کنم جایی که subdomain دارم مثلا a.test.ir/gallery صفحه‌ی گالری
    را پیدا نمی‌کنه در صورتی که   بدون subdomain کار می‌کند 


  • ایمان صفری در ۱۳۹۲/۰۵/۰۹ ۲۰:۲۰
    با تشکر از شما من وقتی از Resolve استفاده می‌کنم مشکلی ندارم اما زمانیکه وارد یک Route تعریف شده میشم هم Css و فایلهای jquery که استفاده کردم به هم می‌ریزه و هم اینکه Url ای که وارد شدم با کلیک روی یک لینک دیگه به آدرس مورد جستجو اضافه میشه از کدهایی که هم آقای نصیری گفتند استفاده کردم ولی نتیجه ای نداد
    • محسن خان در ۱۳۹۲/۰۵/۱۰ ۰:۱۸
      برای خطایابی و یافتن مشکل مطلب نحوه استفاده از افزونه Firebug برای دیباگ برنامه‌های ASP.NET مبتنی بر jQuery می‌تونه مفید باشه.
      • مهمان در ۱۳۹۲/۱۱/۰۸ ۱۶:۲۷
        با سلام و تشکر از شما؛ این افزونه با medium  trust کار نمیکنه راهی وجود داره که با medium Trust کار کنه؟ یه درد و دل! اینکه چرا بعضی هاست‌ها تنظیمات medium  trust رو اعمال میکنن برام عجیبه! میگن به دلیل امنیتی! خب سایت هایی که full trust هستن چجوری مشکل امنیت پیدا نمیکنن! مثل همین موضوع من از asp.net identity هم نمیتونم استفاده کنم چون به owin گیر میده (به همون دلیل امنیتی!)
        • وحید نصیری در ۱۳۹۲/۱۱/۰۸ ۱۶:۵۸
          یکی از اعضای تیم ASP.NET در اینجا عنوان کرده که Medium Trust به صورت رسمی منسوخ شده درنظر گرفته می‌شود و در محصولات آتی ما به هیچ عنوان مدنظر نخواهد بود و هاست‌ها باید به روش OS-level isolation کوچ کنند.
  • مهمان در ۱۳۹۲/۱۱/۲۰ ۱۰:۴۸
    ببخشید من دقیقا منظورتون رو از کلاس global متوجه نمی‌شم....باید چنین کلاسی ایجاد کنیم یا باید با نصب به وجود بیاد؟...لطفا یه توضیح مختصر در این مورد بدین
    • وحید نصیری در ۱۳۹۲/۱۱/۲۰ ۱۱:۳۲
      منظورشان همان فایل global.asax.cs معروف است (Add New Item -> Global Application Class).
  • مهمان در ۱۳۹۲/۱۱/۲۰ ۱۱:۵۸
    سلام؛ من کتابخانه رو به پروژه اضافه کردم. اما برای فعال سازیش به مشکل برخوردم. EnableFriendlyUrls رو نمیشناسه و خطا میده
     System.Web.Routing.RouteCollection' does not contain a definition for 'EnableFriendlyUrls' 
    and no extension method 'EnableFriendlyUrls' accepting a first argument of type 
    'System.Web.Routing.RouteCollection' could be found (are you missing a using directive or an assembly reference?)
    استفاده هم زمان این روش با url routing که مشکلی به وجود نمیاره؟
    • وحید نصیری در ۱۳۹۲/۱۱/۲۰ ۱۲:۲۴
      متد الحاقی است و نیاز به تعریف فضای نام مرتبط با آن در کلاس مورد استفاده می‌باشد (using Microsoft.AspNet.FriendlyUrls).
  • مهمان در ۱۳۹۲/۱۲/۰۳ ۱۰:۴۵
    من این رو اجرا می‌کنم توی صفحه ای به اسم viewSwitcher ارور میده
    هیچ کدوم از کلمات این خط رو نمیشناسه
     <%: CurrentView %> view | <a href="<%: SwitchUrl %>" data-ajax="false">Switch to <%: AlternateView %></a>
    مشکلش چیه؟
    • وحید نصیری در ۱۳۹۲/۱۲/۰۳ ۱۱:۴۸
      مشکلی نداره. یک نمونه برای آزمایش: FriendlyUrlsTests.rar