مروری بر قابلیت جدید ASP.NET FriendlyUrls
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

احتمالا به اهمیت بحث 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 ای که وارد شدم با کلیک روی یک لینک دیگه به آدرس مورد جستجو اضافه میشه از کدهایی که هم آقای نصیری گفتند استفاده کردم ولی نتیجه ای نداد
      • #
        ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۸ بهمن ۱۳۹۲، ساعت ۱۹:۵۷
        با سلام و تشکر از شما؛ این افزونه با 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>
    مشکلش چیه؟