PracticU

Console Self Host

בלי כתוביותעם כתוביות
PracticU › קורס WCF - תקשורת למתקדמים בדוט-נט › Console Self Host
מילון מושגים:
IIS - שרת האינטרנט של מיקרוסופט (Internet Information Services), המריץ אתרים ויישומי אינטרנט על Windows.
ממשק - נקודת מגע בין רכיבים: ממשק משתמש שבו אדם מפעיל תוכנה, או ממשק תכנותי שמגדיר אילו פעולות רכיב אחד חושף לאחר.
מאפיין - תכונה שמצמידים לרכיב ומתארת אותו או את התנהגותו, למשל מאפיין של תגית HTML או שדה באובייקט.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.
Endpoint - נקודת קצה שאליה פונים ב-API, המזוהה בכתובת ומטפלת בסוג מסוים של בקשות. גם מכשיר קצה ברשת.
פרוקסי - שרת מתווך שמעביר בקשות בין לקוח ליעד, ויכול לשמש להסתרה, לסינון, למטמון או לבקרת גישה.

Console Self Host
השיעור מראה איך לחשוף את השירות החוצה מתוך אפליקציית קונסול. מדובר ב-self host, כלומר אפליקציה שמריצים בעצמנו. שירות שרץ תחת IIS נקרא IIS host.
הכנת הממשק
1. Service Contract: מוסיפים את האטריביוט ServiceContract מעל הממשק ICalculator.
2. Operation Contract: מוסיפים את האטריביוט OperationContract מעל כל פונקציה שרוצים לחשוף.
3. הפניות: מוסיפים ל-ConsoleHost את ה-DLL של השירות ואת System.ServiceModel.
ABC: Address, Binding, Contract
1. Address: הכתובת שבה השירות נמצא, למשל http://127.0.0.1:6065/MyCalculator. ה-MyCalculator הוא נתיב וירטואלי בלבד ואין לו קובץ פיזי במחשב.
2. Binding: שיטת תקשורת הנתונים. בשיעור נבחר BasicHttpBinding.
3. Contract: מה שחשוף לעולם, כלומר typeof(ICalculator).
יצירת ההוסט
יוצרים אובייקט ServiceHost ומעבירים לו את הטיפוס Calculator, וההוסט יוצר את האובייקט בעצמו. מוסיפים endpoint באמצעות AddServiceEndpoint, ומעבירים לו לפי הסדר את הקונטרקט, את הביינדינג ואת האדרס.
מסמך WSDL
כדי שלקוחות יוכלו לבנות פרוקסי, מגדירים ServiceMetadataBehavior עם HttpGetUrl, שהוא הכתובת שבה יושב מסמך ה-WSDL, ועם HttpGetEnabled = true. ברירת המחדל של HttpGetEnabled היא false, ולכן צריך להפעיל אותו במפורש. מוסיפים את ההתנהגות להוסט.
הפעלה וסגירה
1. myHost.Open() מעלה את השירות לאוויר.
2. Console.ReadLine() משאיר את הקונסול פתוח, כדי שהשירות לא ייסגר.
3. הקוד עטוף ב-try-catch. בבלוק finally בודקים שההוסט אינו null ואינו במצב Closed, ורק אז סוגרים אותו.
בסיום השיעור השירות עולה לאוויר ומדפיס את הכתובות שבהן הוא מאזין.
השיעור הבא בקורס: הגדרת צרכן ל-Service

פרקי ההרצאה: Console Self Host

  1. 00:00

    הגדרת Service Contract ו-Operation Contract

  2. 01:35

    בניית Console Self Host

  3. 02:48

    הכרת ABC: כתובת, ביינדינג וחוזה

  4. 04:02

    Basic HTTP Binding וחשיפת השירות

  5. 05:07

    יצירת Service Host וה-Endpoint

  6. 07:26

    צרכן השירות ומחלקות הפרוקסי

תמלול ההרצאה: Console Self Host

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

  1. 00:20

    כעת אנחנו הולכים לראות איך אנחנו חושפים את השירות החוצה לעולם. אנחנו הולכים לבנות את ה-host. לצורך כך יש לנו דבר קטן להוסיף בקלקולטור, בשירות שלנו.

  2. 00:32

    אנחנו צריכים קודם כל להוסיף רפרנס שנקרא System Service Model, כדי להגדיר כמה הגדרות בשירות שהוא ה-DLL שלנו. אז אנחנו מוסיפים אותו ל-DLL, ומה שאנחנו צריכים להגדיר זה סך הכל את הדברים הבאים:

  3. 00:47

    א', שאנחנו רוצים לחשוף החוצה, בעזרת WCF, את הממשק i-קלקולטור, יותר נכון את הקונטרקט, כי ממשק אינטרפייס שווה במילים אחרות קונטרקט.

  4. 01:01

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

  5. 01:15

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

  6. 01:27

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

  7. 01:44

    בואו נסגור את מה שלא צריך לראות, יש לנו את הקלקולטור, פורום, ונישאר כרגע עם הקונסול הוסט שלנו, פרוגרם CS. ברגע שאנחנו בונים פרויקט משלנו, שאנחנו מריצים בעצמנו, כמו קונסול אפליקיישן, Windows פורמס אפליקיישן, WPF וכדומה, זה נחשב כ-self host מפני שאנחנו

  8. 02:09

    בעצמנו חושפים או מרימים יותר נכון את הפרויקט לאוויר. אם אנחנו היינו מרימים את הפרויקט הזה על IIS שאנחנו נראה בהמשך איך עושים את זה, אז זה לא נחשב כ-self host זה נחשב כ-IIS host.

  9. 02:21

    אז אנחנו בונים console application שמריץ את זה ולכן זה עכשיו self host. דבר ראשון אנחנו צריכים להוסיף ל-self host שלנו שני DLLים. DLL ראשון זה ה-DLL שאנחנו בנינו כאן וזה בעצם השירות והוספנו אותו מקודם.

  10. 02:37

    DLL שני זה אותו DLL שהוספנו מקודם והוא System.ServiceModel בואו נוסיף גם אותו ואנחנו מוכנים לבנות את ה-host ולחשוף החוצה את השירות לאוויר בשביל לחשוף את השירות לאוויר החוצה אנחנו צריכים להכיר מונח שנקרא ABC ABC זה קיצור של Address Binding Contract והמונח הזה סך הכל מתאר איפה בכל העולם נמצא השירות שלנו זה בעצם יהיה האדרס מהי שיטת תקשורת

  11. 03:08

    הנתונים זה יהיה הביינדינג ומהו החוזה שנחשף לעולם וזה יהיה ה-contract שזה ה-i-calculator שבנינו. אנחנו צריכים לבנות את כל אחד מהם אז בואו נגדיר string address ונגדיר כתובת במחשב הזה שהשירות חי וקיים בכתובת הזאת או אמור להיות בכתובת הזאת.

  12. 03:29

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

  13. 03:55

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

  14. 04:08

    לאחר מכן, אחרי שבנינו את האדרס, אנחנו צריכים לבנות את הביינדינג. יש כל מיני סוגי ביינדינג, אנחנו נראה בהמשך מה הם, אבל כרגע אנחנו ניקח את ה-HTTP הפשוט ביותר, והוא נקרא Basic HTTP Binding.

  15. 04:28

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

  16. 04:48

    זה מתואר על ידי אובייקט מטיפוס טייפ. נגדיר type of ואת i-קלקולטור. יש לנו כרגע את ה-ABC ואנחנו מסוגלים עכשיו לחשוף אותם לאוויר. לצורך חשיפה לאוויר אנחנו בונים אובייקט מטיפוס Service Host, נקרא לו My Host, ו-My Host אמור לדעת איזה שירות הוא משתמש איתו או חושף אותו.

  17. 05:26

    אם היה לי את האובייקט של המחלקה Calculator מוכן הייתי יכול פשוט לתת אותו, אני רואה שאני מקבל פה Object, Singleton, לתת את האובייקט במחלקה Calculator וה-Service Host היה חושף אותו לאוויר, שאנחנו מגדירים לו את ה-ABC ועוד כל מיני הגדרות שאנחנו כבר הולכים לראות.

  18. 05:44

    אבל אם אין לי אובייקט כזה, אז אני יכול פשוט לתת לו type of Calculator והוא ייצור בשבילי אובייקט כזה. הוא חייב ליצור אובייקט או שאני חייב לתת לו איזשהו אובייקט, מפני שהשירות שלי בפועל מתואר על ידי ה-i Calculator, אבל המחלקה שמספקת את השירות היא Calculator וחייב להיות לי איזשהו אובייקט שמספק את השירות

  19. 06:11

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

  20. 06:27

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

  21. 06:43

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

  22. 07:00

    שלושת הרכיבים האלה האדרס והביינדינג והקונטרקט יוצרים לי מה שנקרא end point נקודת קצה שבה אנחנו יודעים מה הכתובת מה היא שיטת תקשורת הנתונים ומה השירות שאנחנו חושפים בעצם.

  23. 07:24

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

  24. 07:50

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

  25. 08:06

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

  26. 08:19

    לא יכול להיות שהוא יבנה אובייקט מהמחלקה כלקולטור אצלו במחשב.

לקורס המלא: קורס WCF אונליין בדוט-נט

ההרצאה הקודמת: Client-Server Projects

ההרצאה הבאה: הגדרת צרכן ל-Service

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

  • Console Output
  • מה זה console application
  • Console Log
  • פקודת Select עם Self-Join

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

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C