
RequestCounterMiddleware. השם Middleware משמש גם ליחיד וגם לרבים.RequestDelegate בשם next, שמאפשר להמשיך את הזרימה לפונקציה הבאה (Middleware, פילטר או אקשן), ומונה פרטי _counter שמאופס.RequestDelegate next, שהמערכת מספקת, ושומר אותו בשדה.Task ומקבלת HttpContext, שמכיל מידע על הבקשה, כמו כתובת ה-IP. מגדילים את המונה, מציגים אותו ב-Console.Title ("Total requests") וקוראים ל-next(context) כדי להמשיך. בלי הקריאה ל-next שום דבר לא ימשיך הלאה.app, מוסיפים app.UseMiddleware<RequestCounterMiddleware>().return, אלא await next(context), ואז כותבים קוד נוסף. הפונקציה צריכה להיות async. התשובה חוזרת דרך אותו Middleware.return אי אפשר לכתוב קוד נוסף בפונקציה.הטקסט המלא של הדקות הראשונות בהרצאה «יצירת Pass-Through Middleware» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז אנחנו הולכים לראות קודם כל Pass-Through Middleware. בואו נבנה. ניכנס רגע לתיקיית Middleware שיש לנו בפרויקט. בקש ימני, Add Class, ובואו נבנה Middleware שפשוט סופר כמה ריקווסטים היו.
בואו נקרא לו Request Counter Middleware. מזכיר לכם שהשם Middleware זה גם רבים וגם יחיד, אין Middlewares. מידלוור בודד שמדבר גם על יחיד וגם על רביד. הנה יש לנו קלאס מעולה ומה שאנחנו רוצים לעשות זה לבנות קודם כל private read only איזה שהוא משתנה מסוג request delegate.
request delegate אני קורא לו next זה בעצם delegate הכוונה אפשרות לקרוא לפונקציה שבעזרת הדלגייט הזה אנחנו בעצם ממשיכים את הפלואו לפונקציה הבאה, למידלווייר הבא או לאקשן.
לפילטר או אם אין לי פילטרים ישירות לתוך האקשן ואנחנו חייבים לקרוא לנקסט בכדי שמשהו יזרום פנימה. נקסט מאפשר להמשיך את הזרימה הלאה. מעבר לזה אנחנו רוצים איזשהו קאונטר בואו ניקח פרייבט אינט, יש לו פרייבט נתחיל אותו באנדרליין, קאונטר נאפס אותו.
אנחנו רוצים איזשהו קונסטרקטור, סיטור, שמקבל את אותו request delegate next. המערכת הולכת לתת לנו את אותה פונקציה שבעזרתה אנחנו ממשיכים את ה-flow, ואנחנו שמים אותה במשתנה הפרטי למעלה, ככה אנחנו בונים middleware.
כעת אנחנו רוצים פונקציה שמחזירה task, מטלה, והיא נקראת invoke. פונקציה מקבלת http context נקרא לו context שמכיל מידע לגבי ה-request הנוכחי אם אני רוצה לדעת אולי מה ה-IP address של המשתמש כל מיני נתונים לגבי ה-request הנוכחי ומה שאנחנו רוצים לעשות זה לבצע את הלוגיקה שלנו והלוגיקה שלנו היא מאוד פשוטה counter++
כי אני סופר כמה פעמים גולשים אליי לאתר בואו נציג איזושהי הודעה לדוגמה בשביל לא להפריע יותר מדי לקונסול נציג את זה בטייטל שלו. קונסול נקודה טייטל שווה total quests לשרשר את counter ואנחנו צריכים to return את אותה פונקציה next שתקבל את הקונטקסט בכדי להמשיך את הזרימה הלאה.
אם אנחנו מריצים את זה אנחנו יכולים לראות שבקונסול שיפתח זה יעלה בכל בקשה שנבצע. עכשיו, זה שבנינו מחלקה לא אומר שמישהו ישתמש איתה, אנחנו צריכים כרגע לרשום אותה. איך אנחנו רושמים מידלווייר בפרוגרם?
אנחנו נכנסים לפרוגרם, וזה מתבצע ברמת האפ. הנה האפ, איך שאנחנו יוצרים את האפ. אנחנו אומרים לו use middleware, ונותנים לו את סוג הנתונים שהיה request counter middleware בצורה כזאת.
ועכשיו המידלווייר שלנו רשום במערכת, ובכל ריקווסט הוא יתבצע. בואו נבדוק. נבצע קונטרול F5, נריץ את המערכת, הנה אנחנו רואים שהמערכת רצה, ותסתכלו על הטייטל, עדיין אין פה שום דבר.
בואו נפנה לפוסטמן ונגיד לפוסטמן שאנחנו רוצים להתחיל לגלוש. בואו ניגש לכאן ונגיד תביא לי את כל הספרים. נשים את זה אולי סייד ביי סייד, נשים את זה פה ואת זה פה, ופשוט נבצע גלישות go והנה אנחנו רואים תביא לי את כל הספרים הכל בסדר ופה למעלה total request one תביא לי את כל הספרים total request וכל פעם
שאנחנו גולשים אנחנו רואים שהאקשן בסופו של דבר עושה את הפעולה אבל זה שאנחנו רוצים לספור כמה פעמים היוזר גלש אנחנו לא רוצים לכתוב את הקוד הזה בתוך האקשן כי גם יש לנו המון אקשנים אנחנו לא רוצים בכל אקשן ואקשן ללכת ולכתוב את אותו קוד שסופר את הדברים.
אני מבקש ללכת ולקבל ספר בודד, אוקיי, בבקשה. הנה אנחנו רואים, עלינו ל-6, עלינו ל-7. המידלווייר מופעל ברמת כלל האפליקציה. בואו נסגור, נחזור בחזרה. מה שבעצם קרה כאן, הפונקציה הזאת התבצעה, או העלתה את הקאונטר ב-1, הציגה איזה משהו והחזירה בחזרה למי שקרא למידלווייר
את האפשרות להמשיך הלאה ולגלוש למידלוויר הבא. ויש לנו פה את הקונספט הזה שנקרא Task, שזה כאילו מטלה שאפשר לבצע תוך כדי מטלות אחרות.
זה כבר שייך לתחום של Advanced C-Sharp שלמדנו בעבר באחד הקורסים, אבל בגדול משפט או שתיים זה פשוט מאפשר לבצע את המידלוויר הזה ביחד עם שאר המידלוויר ושאר התהליכים שיש במערכת ולהמתין עד שהוא יגלוש בחזרה ואז רק המערכת יכולה להמשיך.
ולכן יש לנו פה צורך להמתין מבלי לתקוע את המערכת. זאת הסיבה שיש לנו פה task. אם אנחנו רוצים לבצע פעולה גם אחרי שאנחנו חוזרים בחזרה אז אנחנו יכולים לבצע קוד קצת שונה.
בואו רגע נשים את זה בהערה ונכתוב את הקוד הזה בצורה קצת שונה. באופציה הקצת שונה אנחנו רוצים לבצע המתנה כאן ולא לבצע ריטרן,