PracticU

יצירת פילטרים

בלי כתוביותעם כתוביות
PracticU › קורס MVC › יצירת פילטרים
מילון מושגים:
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).
לוג - רישום מתועד של אירועים ופעולות שמתרחשים במערכת או בתוכנה, המשמש למעקב ולאיתור תקלות.
מאפיין - תכונה שמצמידים לרכיב ומתארת אותו או את התנהגותו, למשל מאפיין של תגית HTML או שדה באובייקט.
בקשה - פנייה שלקוח שולח לשרת כדי לקבל מידע או לבצע פעולה. השרת מחזיר עליה תגובה.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
ירושה - מנגנון בתכנות מונחה עצמים שבו מחלקה יורשת תכונות ופעולות ממחלקת אב, ויכולה להרחיב אותן.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.

יצירת פילטרים
השיעור מסביר מהם פילטרים (Filters) ב-MVC, ובונה פילטר לוגים משלנו. למרות השם, פילטר אינו מסנן נתונים, אלא מריץ קוד לפני או אחרי פעולה.
מהו פילטר
1. הרעיון: פילטר הוא אטריביוט שמריץ קוד כאשר לקוח גולש לפעולה מסוימת. הוא יכול גם לקבל מידע על הבקשה, ולבצע פעולות כמו ניתוב לעמוד אחר או רישום לקובץ.
2. רמות החלה: הפילטר יכול לחול על פעולה בודדת, על כל הפעולות בקונטרולר, או על כל האתר.
בניית פילטר לוגים
3. תיקייה וקלאס: יוצרים תיקייה בשם Filters, ובתוכה מחלקה בשם LoggerAttribute. מומלץ לסיים את שם הפילטר במילה Attribute.
4. ירושה: המחלקה יורשת מ-ActionFilterAttribute ומממשת את IActionFilter.
5. הפונקציה: דורסים את OnActionExecuting, ובתוכה כותבים שורה לקובץ logger.log עם השעה, שם הקונטרולר, שם הפעולה וכתובת ה-IP של המשתמש.
6. נתיב לקובץ: משתמשים ב-Server.MapPath כדי לקבל את הנתיב המלא לקובץ בצד השרת.
7. קריאה לפונקציה המקורית: בסוף הפונקציה שולחים את ה-filterContext לבסיס, כדי שהפעולה עצמה תתבצע.
שלוש דרכים להפעלה
8. על פעולה: מסמנים את האטריביוט מעל הפעולה.
9. על קונטרולר: מסמנים אותו מעל הקלאס, והוא חל על כל הפעולות בקונטרולר.
10. על כל האתר: מוסיפים אותו לקובץ FilterConfig בתיקייה App_Start, והוא חל על כל הפעולות בכל הקונטרולרים.
שימו לב
בהרצה מקומית לא הופיעה כתובת IP אמיתית, כי הגלישה הייתה מקומית. בשרת אמיתי תופיע כתובת המשתמש.
HandleError הוא דוגמה לפילטר מובנה של MVC, שנרשם באותו מקום ב-FilterConfig.
בעזרת פילטר אפשר להריץ קוד לפני כל פעולה, בלי לשנות את הפעולות עצמן.
השיעור הבא בקורס: אבטחה - MVC Security - חלק 1
מילון מושגים:
קוד מקור - הקוד שמפתחים כותבים בשפת תכנות, לפני הידור, המגדיר את פעולת התוכנה.
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).

להורדת קוד מקור של כל הדוגמאות בקורס MVC – לחץ כאן


פרקי ההרצאה: יצירת פילטרים

  1. 00:00

    מה זה Filter ב-MVC

  2. 00:54

    הוספת Filter ל-Action, ל-Controller ולאתר

  3. 01:49

    יצירת תיקיית Filters ומחלקת Logger

  4. 02:45

    ירושה מ-ActionFilterAttribute ו-IActionFilter

  5. 03:24

    מימוש OnActionExecuting בשיטה מפורשת

  6. 04:26

    כתיבה לקובץ Log עם MapPath

  7. 05:49

    רישום זמן, Controller, Action ו-IP

  8. 07:04

    קריאה לפונקציה המקורית של הפילטר

תמלול ההרצאה: יצירת פילטרים

הטקסט המלא של הדקות הראשונות בהרצאה «יצירת פילטרים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:00

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

  2. 00:19

    פילטר זה סך הכל אטריביוט שאנחנו יכולים להוסיף ברמה של אקשן ברמה של קונטרולר ואז הוא תקף לכל האקשנים בקונטרולר או ברמה של כל האתר ואז הוא תקף לכל האקשנים בכל הקונטרולרס שבכל האתר שלנו.

  3. 00:34

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

  4. 00:56

    כמו לגלוש לכל מיני מקומות אחרים או לבצע כל מיני פעולות אז בואו נראה איך זה מתבצע קודם כל אם יש לנו איזשהו קונטרולר מסוים בואו נוסיף פה קונטרולר נקרא לו טסטר ויש לנו כמובן אקשן או אקשנס בתוך הקונטרולר הזה אנחנו מוסיפים את הפילטר על ידי סוגריים מרובעות כאטריביוט רגיל מעל לאקשן ואז הפילטר הזה תקף רק לאקשן

  5. 01:22

    או שמוסיפים אותו לקונטרולר והוא תקף לכל האקשנים רק בקונטרולר הזה או שאנחנו יכולים ללכת לתיקיית אפסטארט לפילטר קונפיד ולרשום אותו כאן על ידי filters.add ולהוסיף את הפילטר שלנו ואז הוא תקף לכל האקשנים בכל הקונטרולרס שבאתר.

  6. 01:45

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

  7. 01:59

    בואו נוסיף תיקייה, נקרא לה Filters בתוך התיקייה הזאת נוסיף קלאס ובואו נחשוב איזה פילטר אנחנו הולכים לבנות. נניח שאנחנו רוצים לבנות איזשהו פילטר שכאשר גולשים לאקשן שהפילטר הזה ניתן לאקשן אנחנו רוצים לרשום לקובץ לוג שהמשתמש גלש לאקשן הספציפי הזה.

  8. 02:22

    אז בואו נקרא לפילטר הזה לוגר בגלל שפילטר זה אטריביוט מאוד מומלץ לסיים אותו במילה אטריביוט. ואנחנו בונים קלאס שנקראת FilterAttribute. נוריד את המרחב שמות הזה, נישאר במרחב שמות הכללי של כל האפליקציה.

  9. 02:43

    אנחנו צריכים לרשת בשביל שזה יהיה באמת Filter@ActionFilterAttribute. ActionFilterAttribute נמצא במרחב השמות SystemWebMVC ולא SystemWebHTTPFilters, שגם שם נמצא מחלקה דומה.

  10. 03:03

    בנוסף אנחנו צריכים לרשת אינטרפייס שנקרא IActionFilter. בתוך המחלקה שאנחנו בונים עלינו לדרוס פונקציה שנקראת on-action-executing אבל אנחנו צריכים לדרוס אותה בשיטה של implicitly implemented.

  11. 03:28

    מה זה אומר? זה אומר שאנחנו צריכים לרשום את שם האינטרפייס i-action-filter, נקודה ואז שם הפונקציה בלי המילה public. זאתי שיטה מסוימת לבצע דריסה של פונקציה שנמצאת באינטרפייס.

  12. 03:44

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

  13. 04:05

    עכשיו בואו פשוט נרשום לתוך איזשהו קובץ לוג את העובדה שהמשתמש גלש לאקשן ספציפית שתתבצע כאשר המשתמש יגלוש אליה, וכמובן שהפונקציה הזאת תתבצע רק אם הפילטר שאנחנו נותנים יהיה תקף לגבי אותו action.

  14. 04:26

    אז בואו נרשום פה using, נפתח stream writer, נפתח כאן איזשהו stream find name, ואנחנו רוצים לגלוש לקובץ שנמצא באתר, לכן אנחנו צריכים לקבל את הנתיב המלא של האתר בצד של השרת.

  15. 04:52

    אנחנו לא יכולים סתם לרשום איזשהו שם של קובץ, אלא אנחנו צריכים להגיע לנתיב המלא, וזה מתבצע על ידי http-context-current-server-map-path ולתת ל-map-path את הנתיב היחסי של האתר שלנו, זאת אומרת התיקייה של האתר, סלאש ממציא איזשהו שם logger.log ואז הפונקציה

  16. 05:22

    מה-path תחזיר לנו את הנתיב המלא בו האתר שלנו נמצא בצד של השרת. נרשום את ה-fine name ונוסיף את המאפיין true עבור append, כלומר כל פעם שגולשים אנחנו רוצים להוסיף את המידע לקובץ טקסט ולא לדרוס אותו.

  17. 05:41

    אז בואו נרשום writer.rightline ונתחיל לרשום פרמטרים. לדוגמה time מהי השעה המדויקת שהמשתמש גלש לאקשן.

  18. 05:54

    ניקח daytime.now נוסיף controller מהו ה-controller שהמשתמש גלש אליו. ניקח בפילטר קונטקסט את ActionDescriptor מידע לגבי האקשן, קונטרולר דסקריפטור זה מידע לגבי הקונטרולר וקונטרולר name זה השם של הקונטרולר שאליו התבצעה גלישה.

  19. 06:26

    לאחר מכן מה האקשן? זה יהיה ב-filter context action description action name. לאחר מכן בואו נוסיף גם את ה-user IP. נניח שאנחנו רוצים גם את ה-IP שלו.

  20. 06:42

    כאן אנחנו צריכים להגיע על ידי filter context HTTP context request זה בעצם ה-request עם כל הפרמטרים שהגיעו מהלקוח. ונלך ל-user-host-address שזה ה-IP של המשתמש.

  21. 06:58

    ואנחנו רשמנו כל מיני דברים כאשר התבצעה גלישה לאיזשהו אקשן. עכשיו נקודה חשובה נוספת ואנחנו צריכים ללכת לפונקציית on-action-executing ולשלוח לה את ה-filter-context מפני שביצענו פה מעין דריסה כזאת ואנחנו רוצים שהפונקציה המקורית גם היא תתבצע.

  22. 07:23

    פה סיימנו לבנות את פילטר שלנו ומה שנשאר לנו לעשות זה להשתמש איתו אז בואו נראה שלוש שיטות להשתמש בפילטר

לקורס המלא: קורס MVC אונליין בעברית

ההרצאה הקודמת: שימוש ב-AJAX MVC - חלק 4

ההרצאה הבאה: אבטחה - MVC Security - חלק 1

קורסים נוספים במסלול

  • קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט
  • קורס דוט-נט - NET Core. - עם Rest API
  • קורס ASP.NET
  • קורס Git ו-GitHub עם Visual Studio