Tags: | Categories: C# Posted by talgiladi on 10/7/2007 9:55 AM | Comments (4)

יש פרוייקט קוד פתוח נחמד שמבצע את המשימה של שיכתוב נתיבים. נניח שיש לי בלוג, או רשימת מוצרים, כל קישור מן הסתם מכיל את שם הדף ועוד איזה 20 פרמטרים כמו מספר קטגוריה, מספר פריט וכו,. אני לא רוצה להראות כזה נתיב מעצבן עם כל הפרמטרים ששמתי לעצמי בתור מתכנת, אני רוצה שהנתיב יראה כמו שם רגיל של דף במערכת. למה? קודם כל מנועי חיפוש, מה לעשות שרוב החברות מנסות לטפס ברנקינג של גוגל...? אז מנועי חיפוש נותנים יותר ניקוד לדפים עם שם "רגיל" דבר שני זה לא אסטטי לפעמים (נחמד אה...) , לא באמת, לפעמים אני מעביר 7 פרמטרים לדף הבא, אני לא רוצה שהמשתמש יראה אותם. אז מה עושים? שיכתוב URL... אני לוקח את הפרמטרים שלי, בונה נתיב שנראה טוב עם סלשים בין הפרמטרים למשל, מגדיר חוקים איך לנתב את הפניות האלה ואז כל פניה כזאת מגיעה לדף המקורי שרציתי עם הפרמטרים שרציתי בצורה הרגילה (Request.Params)

בואו נראה. קודם כל נוריד את UrlRewriter.NET ושם נבחר כמובן בגירסה 2 לדוט נט ( אלא אם כן יש חדשה יותר כבר)

נפתח את הזיפ ונלך לתיקיית bin/release, ושם ניקח את הקובץ Intelligencia.UrlRewriter.dll ונשים אותו בתיקית bin של האתר שלנו (או Add Reference אם בא לכם)

כעת בזהירות ממש נלך ל Web.config ונוסיף כמה שורות

<configSections>

    <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/>

  </configSections>

ועוד חלק:

<system.web>

    <httpModules>

      <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>

    </httpModules>

ואחרון חביב והכי מעניין בשבילנו:

<rewriter>

    <rewrite url="~/products/(\d+)/(\d+)/.+" to="~/products/Details.aspx?categoryid=$1&amp;productid=$2"/>

  </rewriter>

</configuration>

שימו לב... נחמד? כאן אנו בעצם מגדירים בעזרת Regex את הכתובת שאותה הכניס הלקוח ומה המיפוי האמיתי שלה

ומה הגדרתי פה? כל פניה שבהתחלה שלה כתוב products, אחר כך /, אחר כך יופיע מספר, אחר כך / אחר כך שוב מספר ו /, ואז איזשהו שם, להעביר לדף Details.aspx עם המספר הראשון בתור פרמטר בשם categoryid והמספר השני בשם productid. יותר מזה, אפילו אם הדף פיזית לא קיים במערכת, למיפוי שלנו זה לא משנה, הוא מתעלם מכל מה שכתוב אחרי ה / האחרון

נניח שהלקוח הקיש על לינק : http://www.myhost.com/products/2008/02/ProductDetails.aspx
השיכתוב שהכנסתי יעביר אותו לדף http://www.myhost.com/products/ProductDetails.aspx?categoryid=2008&productid=02

זה יכול לעזור לפעמים...

דרך אגב, יש אתר שנקרא http://tinyurl.com שמספק שירות דומה, אתם מכניסים איזה נתיב באורך כמה מאות תווים והוא מוציא לכם נתיב קצר שמפנה אליו בעצם, כשמישהו לוחץ על הלינק הם מפענחים אותו ומעבירים אותו ללינק המקורי,

להורדת פרוייקט דוגמה

Technorati Tags:

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: C# Posted by talgiladi on 9/2/2007 9:50 AM | Comments (4)

קורא לפעמים שיש לנו דרישה לעשות משהו שונה עם הפניה אלינו לאתר, משהו שהשרת לא עושה כמו שמתאים לנו. בדרך כלל כל פניה שמגיעה לאתר, לשרת יש רשימת קבצים וחוקים שניתן לשנות דרך הגדרות השרת, שאומרים לו מה לעשות עם הפניה לפי הסיומת של הקובץ - Aspx, html, gif וכו', או לפי הנתיב שבו נמצא הקובץ, למשל השרת יודע שפניה שמגיעה לתיקיה Bin צריך לסרב.
אז כבר דיברנו פעם על UrlRewriting ששם בעצם התערבנו לשרת בפניה על ידי שיכתוב של הנתיב - אנו נותנים ללקוח נתיב מסוים ובעצם מפנים את הבקשה לקובץ אחר בכלל, אז עכשיו נראה משהו דומה, אבל שונה, איך להתערב לשרת בבקשות ואיך ניתן דרך האפליקציה להגדיר חוקים לשרת ללא ממשק הניהול של השרת.

הבעיה היא כזאת - אני רוצה שכל פניה לתמונה בתיקיה מסוימת תעבור דרך קוד שלי, ולא דרך ברירת המחדל של השרת שהיא פשוט לשלוח את הקובץ. למה? הרבה סיבות, אבל מה שעניין אותי דווקא הוא משהו שאני אראה בפעם אחרת בעזרת השם.
הדבר פשוט ולוקח בערך 4 דקות...
קודם כל ניצור מחלקה שתטפל בבקשה המיוחדת שלי:

namespace MyApplicationDataProvider

{

    class MyCustomHandler : IHttpHandler, IRequiresSessionState

    {

        #region IHttpHandler Members

        bool IHttpHandler.IsReusable

        {

            get { return true; }

        }

        void IHttpHandler.ProcessRequest(HttpContext context)

        {

        }

    }

}

IHttpHandler כדי שתוכל לטפל בפניות.זאת המחלקה הקטנה והפשוטה שלנו - שימו לב שהיא חייבת לירוש מהממשק
ומה נעשה עם הפניה, זה כבר תלוי בנו, אבל נניח שאני פשוט רוצה לכתוב להם בחזרה במקום התמונה שהם ביקשו, אז נעשה את זה בצורה הרגילה של

context.Request.Write("shalom");

אבל אני מניח שתמצאו דברים יותר מעניינים לעשות אם כבר קראתם עד לכאן...

עכשיו רק נשאר להודיע לאפליקציה שלנו איזה פניות להעביר למחלקה שלנו, ונעשה את כמובן דרך הווב קונפיג:

<system.web>

    <httpHandlers>    

      <add path="images/private/*.gif" verb="GET" type="MyApplicationDataProvider.MyCustomHandler, MyApplicationDataProvider"/>     

    </httpHandlers>

מה עשינו בדיוק? אמרנו לשרת שכל פניה שתגיע לתיקיה images/private וסוג הקובץ הוא gif להעביר למחלקה שלנו שנקראת MyCustomHandler ושם המתחם הוא MyApplicationDataProvider
אני גם ציינתי שרק אם הבקשה באה בצורה GET, אבל אם רוצים אפשר להפריד עם פסיק ולהוסיף גם POST

Technorati Tags: ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5