PracticU

יצירת Short-Circuit Filter

בלי כתוביותעם כתוביות
PracticU › קורס דוט-נט - NET Core. - עם Rest API › יצירת Short-Circuit Filter
יצירת Short-Circuit Filter
הרצאה על Filter מסוג Short-Circuit שמגביל כמה בקשות כל משתמש רשאי לשלוח ביום, כמו ב-API חינמי, וחוסם אותו כשהוא חורג.
השלבים העיקריים
1. היסודות: מחלקה LimitFilter שיורשת מ-ActionFilterAttribute. עושים override רק ל-OnActionExecuting, כי הבדיקה נעשית לפני ה-Action. את הקריאה ל-base אפשר להסיר, כי היא לא מועילה כאן.
2. המכסה: קבוע DailyQuota, בדוגמה 1000 פעמים ביום. חריגה נחשבת ניצול לרעה (abuse) של ה-API החינמי.
3. מעקב: Dictionary שבו המפתח הוא כתובת ה-IP והערך הוא מספר הבקשות (request counts).
4. ספירה: מוציאים את HttpContext.Connection.RemoteIpAddress. אם כבר קיים מפתח, מגדילים את הערך ב-1, ואחרת מוסיפים את הכתובת עם 1.
5. חסימה: אם הערך של הכתובת גדול מהמכסה, יוצרים ContentResult עם StatusCode של Forbidden, תוכן הודעה שחרגת מהמכסה היומית ושמציינת את מספר הבקשות, ו-ContentType של טקסט רגיל. מציבים אותו ב-context.Result, והבקשה חוזרת בלי להגיע ל-Action.
6. אישור: אם לא חרגו, לא קובעים Result, והזרימה ממשיכה.
7. בדיקה: להדגמה מורידים את המכסה ל-5 ומציגים בקונסול את הספירה. אפשר לרשום את הפילטר על ה-Controller כולו או על Action ספציפי כמו GetAllBooks. בקריאה השישית ב-Postman מתקבלת הודעת החריגה.
שימו לב
- הדוגמה לא מאפסת את המונה כל יום, ולכן היא לא באמת "יומית". המרצה משאיר לתלמידים להוסיף מנגנון שמזהה יום חדש ומאפס.
- בבדיקה אחת לא הגיעה תשובה, כי המרצה נגע בטעות בקונסול והשרת נעצר.
אפשר עכשיו לחסום משתמש שחרג ממכסה לפני שהבקשה מגיעה ל-Action.
השיעור הבא בקורס: יצירת Interceptor עבור מסד הנתונים
מילון מושגים:
בקשה – פנייה שלקוח שולח לשרת כדי לקבל מידע או לבצע פעולה; השרת מחזיר עליה תגובה.
API – ממשק תכנותי שמגדיר כיצד תוכנה אחת פונה לאחרת ומחליפה איתה נתונים ופעולות.
מחלקה – תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
חריגה – מצב שגיאה שמתרחש בזמן ריצת התוכנית ומפסיק את המהלך הרגיל, אלא אם הקוד תופס ומטפל בו.
Dictionary – מבנה נתונים שמאחסן זוגות של מפתח וערך, ומאפשר שליפה מהירה של ערך לפי מפתחו.
כתובת IP – מספר שמזהה באופן ייחודי מכשיר ברשת מבוססת פרוטוקול IP, ומאפשר לשלוח אליו ולקבל ממנו מידע.
קונטרולר – רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
Postman – כלי לבדיקת API: שליחת בקשות HTTP לשרת ובחינת התגובות, נפוץ בפיתוח ובבדיקות.

פרקי ההרצאה: יצירת Short-Circuit Filter

  1. 00:00

    בניית Rate Limit Filter

  2. 00:42

    דריסת OnActionExecuting בלבד

  3. 01:19

    הגדרת ה-Daily Quota

  4. 02:13

    קבלת ה-IP וספירת הגלישות

  5. 03:12

    בדיקת חריגה מהמכסה

תמלול ההרצאה: יצירת Short-Circuit Filter

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

  1. 00:02

    אז נשארנו לראות רק את שירט סרקט פילטר. בואו נוסיף עוד פילטר לתיקיית ה-middleware ובואו נבנה פילטר שבעצם בודק כמה פעמים משתמשים גולשים ויש לו איזה קוואטה לימיט מסוים שהוא לא מאשר לגלוש מעבר. נניח שה-Rest API שלנו הוא חינמי ואנחנו אומרים אוקיי תשתמשו בחינם אבל לא מעבר לאיזשהו דיילי מסוים.

  2. 00:29

    טוב, אז בואו נלך ונבנה אותה limit filter, go. ואנחנו רוצים כמובן לבצע פה הורשה של action filter attribute, ומה שאנחנו בעצם רוצים לעשות כרגע זה לדרוס אך ורק את הפונקציה on action executing, כי אנחנו רוצים לבצע משהו לפני, ולכן לא מעניין אותי מהפונקציה שתתבצע אחרי הפילטר, אם הכל בסדר אני מאשר את הזרימה אם משהו לא

  3. 01:01

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

  4. 01:28

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

  5. 01:57

    אנחנו רוצים שה-value יהיה כמה פעמים, הוא גלש לנו באותו זמן או באותו יום, הוא לא משנה, ובואו נקרא לו quotas, נניח, או requests, או לא משנה, בואו נקרא לו request counts, כמה פעמים אתה מבצע גלישות, ואנחנו רוצים לייצר dictionary חדש בצורה כזאת.

  6. 02:19

    אוקיי, יש לנו עכשיו את הפרמטרים. מה אנחנו רוצים לעשות? דבר ראשון, בואו נקבל את ה-IP address של היוזר, סטרינג IP שווה קונטקסט HTTP קונטקסט נקודה קונקשן remote address נמיר אותו לסטרינג ונגיד לו תקשיב זה הולך להיות remote address הכל טוב נקסט הדבר הבא שאנחנו רוצים זה לבדוק האם הIP הזה כבר קיים ב-request counts הזה אם ה-request counts נקודה contain key IP

  7. 02:53

    אז זה אומר שהיוזר כבר גלש לשירות שלנו והוא אמור כבר להופיע שם. אז אנחנו רוצים לפנות אליו request counts במיקום IP, פלוס פלוס, ולהעלות אותו ב-1.

  8. 03:06

    אחרת הוא פעם ראשונה גולש אלינו, request counts נקודה add, בוא תוסיף לי את ה-IP עם המספר 1, כי זו פעם ראשונה שהוא גלש אז זו גלישה ראשונה שלו.

  9. 03:19

    אם זו לא גלישה ראשונה הוא ייכנס לפה ויעלה אותו ל-2, 3, 4, 5, לא משנה, ואנחנו נוכל לספור אותו. עכשיו אחרי שהוספנו אותו ל-dictionary אנחנו רוצים לבדוק אם הוא חורג מהקווטה, אם quest counts במיקום IP יותר גדול מה-daily quota.

לקורס המלא: קורס דוט-נט - NET Core. - עם Rest API

ההרצאה הקודמת: יצירת Pass-Through Filter

ההרצאה הבאה: יצירת Interceptor - עבור מסד הנתונים

הרצאות קשורות מקורסים אחרים

  • map & filter
  • Angular 4 - Filter and Pipe
  • פקודת Get-WinEvent - חלק 4 - Filter

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

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