Presentation is loading. Please wait.

Presentation is loading. Please wait.

אפליקציות אסינכרוניות ל-Windows 10

Similar presentations


Presentation on theme: "אפליקציות אסינכרוניות ל-Windows 10"— Presentation transcript:

1 אפליקציות אסינכרוניות ל-Windows 10
WCF - Windows Communication Foundation

2 WCF אבולוציה של תקשורת מה זה SOA? מה זה WCF ? למה WCF?
TCP IP העברת מידע בין ספק לצרכן.

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

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

5 מה זה בכלל שירות? חסרונות: יתרונות:
הגישה של "תוכנה כשירות" (Software as a Service) היא לא רעיון חדש. הרעיון הכללי הוא תוכנה המסופקת כשירות הניתן באמצעות אירוח בשרת של הספק במקום רכישת מוצר תוכנה והתקנתו בשרתי של הרוכש. חסרונות: פונקציונאליות – לא תמיד היא מלאה ומותאמת במלואה לצרכי המשתמש בשירות. ביצועים – עבודה מול שרתים מרוחקים. אבטחת מידע – פגיעות גדולה יותר מאשר תוכנה מוטמעת. אינטגרציה – לעיתים מורכבת. תלות בספק השירות. יתרונות: נחסכות העלויות של רכישה והתקנת שרתים. נחסכת העלות של בניית ותחזוקת התוכנה. התשלומים עבור השירות הם בדרך זולים יותר. זמן – השילוב של השירות הוא מהיר מאוד כי השירות הוא מוצר שכבר קיים. מודולאריות – ישנם שירותים מודולאריים שניתן להרחיב את השימוש בהם בעת הצורך. גמישות – שירות שלא מספק את הסחורה או שאינו מתאים יותר ניתן להחלפה בקלות.

6 קצת היסטוריה - Evolutions
Socket-based Models Remote Procedure Calls DCOM CORBA Web Services and .NET Remoting WCF (גרסה אחרונה 4.5)

7 What is WCF? WCF היא תשתית לבניית שכבת תקשורת בין מערכות ואפליקציות.
טכנולוגיה שמאפשרת למערכות תוכנה "לדבר" אחת עם השנייה. תשתית לבניית שכבת תקשורת המאפשרת למערכת ממוחשבת להפיץ מידע או לצרוך מידע ממערכות ומאפליקציות אחרות. הטכנולוגיה מאפשרת להגדיר את השירות עצמו, מסייעת בבניית המארח של השירות (Host) ובבניית הלקוח הצורך את השירותים (Client).

8 What is WCF? אין חדש תחת השמש, אין ל- WCF יכולת שלא הייתה קיימת בעבר.

9 Why WCF? תמיכה בתקנים (XML, JSON, REST).
"צמידות נמוכה" - Losely Coupled Services הליך התקשורת המורכב הפך להיות דומה לתהליך תכנותי רגיל באמצעות מתודות, טיפוסים וממשקים. הגדרות תקשורת בקובץ ההגדרות Web.Config

10 Why WCF? אין תלות בפרוטוקול תקשורת אחד.
הלקוח לא חייב להיות כתוב ב-.NET מאפשר גמישות גדולה במעבר מפרוטוקול תקשורת אחד למשנהו. הורדת את העלויות של אינטגרציה בין תוכנות. ארכיטקטורת SOA.

11 What is SOA? מה זה OOP? שיטה לתכנון מערכת תוכנה ברמת המיקרו. מה זה SOA? שיטה לתכנון מערכת תוכנה ברמת המקרו. Service Oriented Architecture - SOA בעולמנו רבות ממערכת התוכנה מקושרות אחת לשנייה, מספקות וחולקות שירותים ביניהן. מערכות תוכנה שמקושרות וחולקות מידע נקראות מערכות מבוזרות. APP 1 APP 2 APP 3 APP 4

12 היא פשוטה. היא עובדת. What is SOA?

13 דוגמה: What is SOA? קונים מוצרים האתרי מכירות האינטרנט? כיצד זה עובד.
תחילה אנו מחפשים את המוצר, כאשר החלטנו לרכוש האתר פונה למערכת תוכנה של היצרן/יבואן לבדוק את הזמינות במלאי, לאחר מכן אנו מבצעים את התשלום באמצעות שרות רשת של חברת סליקת האשראי. לאחר ששילמנו וסיימנו עם תהליך הרכישה האתר פונה לחברת שליחויות על מנת להזמין משלוח. מערכות שמדברות עם מערכות אחרות.

14 דוגמה: What is SOA? מזמינים נופש בחו"ל דרך האינטרנט? כיצד זה עובד.
תחילה אנו נכנסים לאתר תיירות, בוחרים יעד, תאריך, חברת תעופה, בית מלון, "רכב .... ואולי וואצ'רים למוזיאונים או הצגות. האתר פונה למערכת תוכנה של חברת התעופה ובודק האם יש טיסה ליעד המבוקש בתאריך המבוקש ואת המחיר. לאחר מכן האתר פונה למערכת תוכנה של בית המלון ובודק האם יש חדר פנוי ואת המחיר. האתר פונה לחברת השכרת רכב ובודק את המחיר לרכב המבוקש ומהו המחיר. האתר מרכז את התשובות והמחירים. בהנחה שאנו מסכימים למחיר אנו מבצעים את התשלום באמצעות שרות רשת של חברת סליקת האשראי. לאחר ששילמנו האתר פונה לשירותי הרשת של חברת התעופה, המלון וחברת השכרת הרכב ומבצע את ההזמנה. מערכות שמדברות עם מערכות אחרות.

15 How WCF? נניח שאנו רוצים לשלוח חבילה לחו"ל מה המידע שאנו נדרשים לספק?
בראש ובראשונה כתובת הנמען, לאן החבילה צריכה להישלח? כיצד החבילה תשלח מבין כל האופציות שילוח? דרך הדואר? דרך חברת שליחויות? האם החבילה תשונע במטוס או באוניה? מה תוכן החבילה? משקל, נפח. ב- WCF זה אותו הדבר: אנחנו שולחים חבילות (מידע) ללקוח מסוים (הנמען) בשיטת שילוח מסוימת (HTTP, TCP ...) זה נקרא Endpoint

16 ABC How WCF? מה זה Endpoint? ה- Endpoint מספק לנו מענה לשלוש שאלות:
היכן ניתן למצוא את השירות? (Address) איך מתחברים לשירות? (Binding) מה השירות מספק? (Contract) או בקיצור: ABC

17 ABC (Address, Binding, Contract)
How WCF? ABC (Address, Binding, Contract) “A” – מה הכתובת של השירות? “B” – איך ניתן להתחבר ולדבר עם השירות. “C” – מה השירות יכול לעשות עבורי. Address היכן השרות נמצא? מה הכתובת שלו? – שם השרת, שם אתר, כתובת Binding איזה פרוטוקול? - HTTP, TCP... מגדיר גם האם המידע שיעבור יהיה בפורמט טקסטואלי או בינארי, מספק הגדרות Security . Contract אילו שירותים מיוצאים ונחשפים ללקוחות? מגדיר את הממשקים של השירות.

18 פרקטיקה – בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract שלב שני: הגדרת מארח שלב שלישי: בניית לקוח ה-"Hello World" של שרותי הרשת – שירות מחשבון: נבנה שירות אשר מספק יכולת של מחשבון, תחילה נבנה את השירות, לאחר מכן נבנה את המארח שלו (Host) ולבסוף נבנה את הלקוח שלו. לא נסתמך, בשלב זה, על הקוד ש-Visual Studio מייצר עבורנו.

19 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים תחילה נפתח פרויקט חדש ב-Visual Studio 2015: ב - New Project->Visual C#->Windows Desktop נבחר בתבנית פרויקט WCF Service Library: שם הפרויקט: CalculatorService. נלחץ OK והפרויקט יבנה על ידי Visual Studio. * בכתיבת ה- Server מומלץ להריץ את Visual Studio כ-Run as admin.

20 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים כבר בשלב הזה יש לנו שירות שעובד. נריץ אותו באמצעות F5 או לחיצה על Debug ונפתח חלון שנקרא "WCF Test Client": לחיצה כפולה על אחת מהמתודות מריצה אותן. לאחר בדיקת ההרצה נמחק את הקבצים IService1.cs ואת Service1.cs כי אין לנו בהם צורך.

21 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים פרויקט מסוג WCF Service Library הוא Class Library לכל דבר ועניין למעט שתי תוספות חשובות: Reference למרחב השמות System.ServiceModel Reference למרחב השמות System.Runtime.Serialization האם אפשר לפתוח Class Library רגיל ולהוסיף לו Reference לאסמבלי הללו? כן, זה אפשרי, אבל לא מומלץ. פרויקט WCF Service Library מוסיף יכולות קינפוג ל-Project Properties שאין ב- Class Library רגיל.

22 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים איך מגדירים אילו יכולות ה-Service יספק ללקוח? השירותים שה-Service נקבעים על ידי מחלקה ייעודית המוגדרת בשירות. על מנת שללקוח תהיה גישה למחלקה היא צריכה להיות מוגדרת כ-Contract. מה זה Contract? Contract זה ממשק שמגדיר את הפונקציונאליות של השירות, את רשימת המתודות שהלקוח יוכל להפעיל, לממשק מתלווה מחלקה שמממשת את ה-Contract. איך מגדירים Contract? כדי להגדיר שהממשק הואContract מעטרים אותו בשני Attributes: ServiceContarct – המגדיר את הממשק כממשק המשמש כ-Contract OperationContract – המגדיר את המתודות שיחשפו ללקוח.

23 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים נוסיף ממשק חדש שנקרא ICalculator.cs (Add->New Item->Interface). נוסיף לקובץ את הקוד הבא: ServiceContract מעטר את הממשק עצמו ומכריז שהממשק ישמש כחוזה בין השירות ללקוח. OperationContract הוא חלק בלתי נפרד מה- ServiceContract ומגדיר את המתודות שהשירות יחשוף ללקוח. כמובן שניתן להגדיר בממשק מתודות שלא יחשפו, פשוט לא נעטר אותם ב- OperationContact. [ServiceContract] public interface ICalculator { [OperationContract] double Sum(double num1, double num2); double Sub(double num1, double num2); double Mul(double num1, double num2); double Div(double num1, double num2);

24 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים public class Calculator : ICalculator { public double Sum(double num1, double num2) return num1 + num2; } public double Sub(double num1, double num2) return num1 - num2; public double Mul(double num1, double num2) return num1 * num2; public double Div(double num1, double num2) return num1 / num2; נוסיף מחלקה חדשה שמממשת את הממשק. נוסיף ממשק חדשה שנקראת Calculator.cs (Add->Class). המחלקה Calculator תממש את הממשק ICalculator. נכתוב את המימושים למתודות. נשמור ונקמפל.

25 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים בדיקה לאחר שסיימנו עם בניית השירות ניתן לבדוק אותו עם הכלי "WCF Test Client ", F5 או Start והכלי מורץ אוטומטית: בוחרים את אחת המתודות, מזינים פרמטרים ולוחצים על Invoke. מתודות פרמטרים הרצה תוצאה

26 בניית שירות WCF בשלושה שלבים
שלב ראשון: כתיבת Service Contract בניית שירות WCF בשלושה שלבים סיימנו את השלב הראשון, כתבנו את ה- Contract של השירות מבוסס WCF. בשלב זה השירות אינו שימושי (נתמודד עם זה בשלב הבא) למה?

27 בניית שירות WCF בשלושה שלבים
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים השירות שכתבנו הוא DLL, אין לו יכולת לרוץ, אין לו יכולת להתחבר לעולם החיצון, השירות זקוק לתוכנה מארחת (Host) אשר תקשר בינו לבין הלקוח. ה- Host יכול להיות: Console Application, WPF, Windows Service, IIS. בניית ה- Host היא מאוד פשוטה. נתחיל בהוספת פרויקט חדש מסוג Console Application אשר ישמש כ-Host.

28 בניית שירות WCF בשלושה שלבים
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים נוסיף ייחוס לאסמבלי System.ServiceModel (Reference). נוסיף ייחוס לאסמבלי של השירות (Reference).

29 בניית שירות WCF בשלושה שלבים
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים נוסיף את הקוד הבא: המחלקה ServiceHost מוגדרת במרחב השמות Sytem.ServiceModel. המחלקה ServiceHost מקבלת ייחוס ל-Contract וחושפת אותו לתוכנית הלקוח. היא מאזינה לבקשות מהלקוח ומפעילה עבורו את המתודות. בנוסף המחלקה ServiceHost מטפלת ב-ServiceDescription, אובייקט מהמחלקה הזו מטפל בהגדרות של ה- Endpoint בקובץ App.Config. class Program { static void Main(string[] args) ServiceHost service = new ServiceHost(typeof(CalculatorService.Calculator)); service.Open(); Console.ReadLine(); }

30 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013 <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <services> <service name="CalculatorService.Calculator" > <endpoint address=" binding="basicHttpBinding" contract="CalculatorService.ICalculator"></endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true" httpGetUrl=" </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration> הקובץ App.Config מעבירים את הקובץ ל-Host (אסור שיישאר בפרויקט השירות) הגדרת Endpoint הגדרת Behavior

31 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013 החלק הראשון מתווסף על ידי Visual Studio, מגדיר את גרסת התשתית, אין מה לגעת בו. החלק השני מגדיר את ה- Endpoint: Name – התוכנה המארחת יכולה לארח מספר Services ולכן צריך להגדיר שם ייחודי לכל אחד. השם מורכב ממרחב השמות + שם המחלקה המממשת את ה- Contract (NamespaceName.ClassName). <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <services> <service name="CalculatorService.Calculator" > <endpoint address=" binding="basicHttpBinding" contract="CalculatorService.ICalculator"></endpoint> </service> </services>

32 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013 <services> <service name="CalculatorService.Calculator" > <endpoint address=" binding="basicHttpBinding" contract="CalculatorService.ICalculator"></endpoint> </service> </services> בתגית <endpoint> נגדיר את ה- “ABC”. המאפיין address מגדיר את הכתובת בה ה-Host מאזין, הכתובת מתחילה ב-HTTP וזה משפיע על השיטה של ה- Binding המאפיין Binding מגדיר את פרוטוקול התקשורת, בדוגמה הפרוטוקול יהיה basicHttpBinding, דהיינו פרוטוקול http בסיסי. המאפיין contract מורה ל-Host איזה Contract לחשוף, ה-Contract נחשף בשמו המלא: NamespaceName.InterfaceName.

33 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2013 <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true“ httpGetUrl=" </behavior> </serviceBehaviors> </behaviors> הגדרת baseAddresses מורה ל-Host לחשוף גם את ה-WSDL, r/ סיימנו עם המארח, הגיע זמן לקוח.....

34 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015 תחילת הגדרת ה-Service <configuration> <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> <system.web> <compilation debug="true" /> </system.web> <system.serviceModel> <services> <service name="CalculatorService.Calculator"> <host> <baseAddresses> <add baseAddress = " /> </baseAddresses> </host> <endpoint address="" binding="basicHttpBinding" contract="CalculatorService.ICalculator"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration> הקובץ App.Config מעבירים את הקובץ ל-Host (אסור שיישאר בפרויקט השירות) שם ה- Service כתובת ה- Service הגדרת ה-Endpoint הגדרת Behavior סיום הגדרת ה-Service

35 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015 <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> <system.web> <compilation debug="true" /> </system.web> מורה ל-CLR להשתמש ביכולות האסינכרוניות החדשות כאשר ה- HOST הוא ASP מאפשר Debugging כאשר ה- HOST הוא ASP

36 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015
שלב שני: הגדרת מארח בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015 הכתובת של ה- Service <baseAddresses> <add baseAddress = " /> </baseAddresses> <endpoint address="" binding="basicHttpBinding" contract="CalculatorService.ICalculator"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> הגדרת ה- Endpoint ל-Service הפניה ל-Service Contract הגדרת ה- Endpoint ל-Metadata חשיפת Metadata על ידי ה- Service כמו WSDL

37 בניית שירות WCF בשלושה שלבים ב-Visual Studio 2015
מגדיר כיצד הלקוח מתקשר עם ה- Service <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> ה- Contract מגדיר מה הפעולות שהשירות חושף. ה-Endpoint מגדיר היכן ניתן למצוא אותו. ה- Behavior מגדיר כיצד הלקוח מתחבר עם השירות, יכול להגדיר אבטחה, מקביליות, ניהול cache וכו'.

38 בניית שירות WCF בשלושה שלבים
שלב שלישי: בניית לקוח בניית שירות WCF בשלושה שלבים את זה אתם כבר מכירים, אין הרבה הבדל בין בנית לקוח ל-WCF ללקוח WebService. בוחרים Add Service Reference. כותבים את ה- Address לוחצים GO מגדירים מרחב שמות. ו-OK. Visual Studio אוטומטית מוסיף ייחוס לאסמבלי System.ServiceModel.

39 בניית שירות WCF בשלושה שלבים
שלב שלישי: בניית לקוח בניית שירות WCF בשלושה שלבים ב- Main (או בכל מקום אחר) נקצה פרוקסי ועליו נפעיל את זה השירותים השונים שנמצאים אי שם...... class Program { static void Main(string[] args) CalculatorClient calc = new CalculatorClient(); Console.WriteLine(calc.Sum(100, 200)); Console.ReadLine(); }

40 Data Contract באמצעות ServiceContract הגדרנו את מבנה השירות כפי שהוא נחשף ללקוח. באמצעות DataContract נגדיר את המידע שיעבור מהשירות ללקוח או מהלקוח לשירות. ניתן לראות את ה-Data contract כ-"הסכם" בין השירות ללקוח המגדיר את המבנה והצורה של הנתונים אשר יועברו בין השירות והלקוח. מגדיר את הפורמט של הנתונים המועברים אל הלקוח ומן הלקוח. ה-DataContract ממפה מחלקות מידע וטיפוסים ל-XML Schema.

41 Data Contract DataContract נתמכים על ידי מנגנון ה- Serialization.
מגדיר כיצד מבוצע Serialization ו-Deseralization. מוגדר במרחב השמות: System.Runtime.Serialization (יש להוסיף גם את האסמבלי) מה זה Serialization? סריאליזציה זה תהליך בו מבני נתונים מתורגם לפורמט הניתן לאחסנה בקובץ/זיכרון או להעברה על גבי רשת מחשבים, ולאחר מכן "להקים אותו לתחייה" בתהליך הנקרא דיסריאליזציה. Computer 1 Data Structure Computer 2 Serialization Deserialization

42 Data Contract איך מגדירים DataContract?
כדי להגדיר מחלקה/מבנה או enum כ-Data Contract מעטרים אותו בשני Attributes: DataContarct – ברמת המחלקה/ מבנה או enum. DataMember – מגדיר את השדות או המאפיינים שישתתפו בתהליך הסריאליזציה. כדי להגדיר List נגדיר : CollectionDataContract [DataContract] public class MyClass { [DataMember] public string Data1 { get; set; } public int Data2 { get; set; } public double Data3 { get; set; } public List<int> Data4 { get; set; } } [CollectionDataContract] public class MyList:List<MyType> { }

43 הטיפוסים הנתמכים Data Contract
הטיפוסים הבסיסיים של CLR (Int16, Int32, Int64, Boolean, Byte, Char, String, Single, Decimal, Double, Object, DateTime, UInt16, UInt32, UInt64). enum Delegate מערכים ורשימות (כולל Generics) טיפוסים המממשים את הממשק ISerializable

44 פרקטיקה – בניית שירות WCF עם DataContract בשלושה שלבים
שלב ראשון: כתיבת Service Contract והגדרת ה-DataContract שלב שני: הגדרת מארח שלב שלישי: בניית לקוח בניית שירות המרת כספים. נבנה שירות אשר ממיר בין ערכי מטבעות. את שערי המטבעות העדכניים ניתן לקבל בפורמט XML באתר של בנק ישראל בכתובת: תחילה נבנה את השירות, נגדיר את ה-DataContract ואת ה- ServiceContract. בשלב השני נבנה את המארח (Host) ולבסוף נבנה את הלקוח.

45 בניית שירות WCF עם Data Contract
דוגמת הקוד תכיל 5 פרויקטים שונים: הפרויקט הראשון יכיל את ה- DataContract בפרויקט השני נגדיר את ה- Business Logic. הפרויקט השלישי הוא ה-Service עצמו. הפרויקט הרביעי הוא ה- Host. הפרויקט החמישי הוא תוכנת הלקוח הצורכת את שירותי ה- Service.

46 שלב ראשון – Data Contract
שלב ראשון: כתיבת Data Contract שלב ראשון – Data Contract נפתח פרויקט Class Library חדש ונקרא לו CurrencyModel. נוסיף ייחוס לאסמבלי System.Runtime.Serialization נוסיף מחלקה הנקראת Currency. [DataContract] public class Currency { [DataMember] public string Name { get; set; } public string CurrencyCode { get; set; } public string Country { get; set; } public int Unit { get; set; } public double Rate { get; set; } }

47 שלב ראשון – Data Contract
שלב ראשון: כתיבת Data Contract שלב ראשון – Data Contract המחלקה Currency מייצגת שערי מטבע אחד. מכיוון שנעביר ללקוח רשימה של הרבה מטבעות נוסיף מחלקת List. נוסיף מחלקה הנקראת CurrencyList. נעטר את המחלקה CurrencyList ב- [CollectionCurrencyContract]. [CollectionDataContract] public class CurrencyList:List<Currency> { }

48 שלב שני: כתיבת Business Layer שלב שני – Data Contract הפרויקט שלנו זקוק ל-Business Layer. שכבה שתקרא את המידע מהשרת של בנק ישראל ותפענח אותו, תבצע את חישובי המרות המטבעות .... נפתח פרויקט Class Library חדש ונקרא לו CurrencyBL. נוסיף ייחוס לאסמבלי CurrencyModel שכתבנו בשלב הקודם. נוסיף מחלקה הנקראת CurrenciesManager. public class CurrenciesManager { private CurrencyList ParseXML() { … } public CurrencyList GetCurrencyList() { … } public List<string> GetCurrenciesNameList() { … } public double Convert(Currency source, Currency dest,double amount) { … } }

49 שלב שלישי – Service כתיבת השירות עצמו.
שלב שלישי: כתיבת Service שלב שלישי – Service כתיבת השירות עצמו. נפתח פרויקט WCF Service Library חדש ששמו CurrencyServiceModel. נוסיף ייחוס לאסמבלי CurrencyViewModel שכתבנו בשלב הקודם. נוסיף את ה- ServiceContract האמצעות ממשק הנקרא ICurrencyService: [ServiceContract] public interface ICurrencyService { [OperationContract] CurrencyList GetAllCurrencies(); Currency GetCurrency(string currency_name); double Convert(Currency source, Currency dest, double amount); }

50 שלב שלישי – Service כתיבת השירות עצמו.
שלב שלישי: כתיבת Service שלב שלישי – Service כתיבת השירות עצמו. נממש את הממשק, נוסיף מחלקה הנקראת CurrencyService: public class CurrencyService : ICurrencyService { public CurrencyList GetAllCurrencies() CurrenciesManager manager = new CurrenciesManager(); return manager.GetCurrencyList(); } public Currency GetCurrency(string currency_name) throw new NotImplementedException(); public double Convert(Currency source, Currency dest, double amount) return manager.Convert(source, dest, amount);

51 שלב רביעי: כתיבת HOST שלב רביעי – HOST כתיבת המארח. נפתח פרויקט WPF או Console Application אשר ישמש אותנו במארח של ה- Service. המארח הוא זה שחושף את השירות לתוכנת הלקוח. נוסיף ייחוס לאסמבלי System.ServiceModel. ונוסיף ייחוס לשלושת הפרויקטים שכתבנו בשלבים הקודמים: CurrencyModel, CurrencyServiceModel, CurrencyBL. נעביר את ה-App.Config מפרויקט ה-Service לפרויקט ה- HOST. הרצת השירות: ServiceHost service = new ServiceHost(typeof(CurrencyService)); service.Open();

52 שלב חמישי: לקוח שלב חמישי – לקוח כתיבת המארח. נפתח פרויקט WPF או Console Application אשר ישמש אותנו כלקוח. נוסיף Web Reference לשירות (השירות חייב לרוץ). הכתובת של השירות מופיעה ב-App.Config של ה- HOST: נוסיף את מרחב השמות של השירות למחלקה בה נעשה בו שימוש, לדוגמה מרגע זה ניתן להשתמש בו בלקוח. <baseAddresses> <add baseAddress=" </baseAddresses> using Client.CurrencyServiceReference;

53 מחלקות המוגדרות ב-DataContract
שלב חמישי: לקוח שלב חמישי – לקוח public partial class MainWindow : Window { private CurrencyServiceClient currencyService = new CurrencyServiceClient(); private CurrencyList currencyList; private Currency sourceCurrency; private Currency destCurrency; public MainWindow() InitializeComponent(); Init(); } private void Init() currencyList = currencyService.GetAllCurrencies(); foreach(var item in currencyList) lstSourceCurrencies.Items.Add(item.Country + " - " + item.Name); lstDestCurrencies.Items.Add(item.Country + " - " + item.Name); לדוגמה: הפרוקסי מחלקות המוגדרות ב-DataContract קריאה לשירות

54 TCP Binding שינוי הפרוטוקול מ-HTTP ל-TCP מתבצע רק בקובץ הקונפיג.
אין צורך לשנות את הקוד, אין צורך לקמפל מחדש. מה נשנה בקובץ קונפיג? את ה-BaseAddress: <baseAddresses> <add baseAddress = "net.tcp://localhost:8733/CalculatorService/Calculator/" /> </baseAddresses> את ה-endpoint: <endpoint address="" binding="netTcpBinding“ contract="CalculatorService.ICalculator"> וגם את זה של ה-Metadata Exchange: <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/> ונמנע קבלת Metadata באמצעות HTTP <serviceMetadata httpGetEnabled="false" />

55 TCP Binding ומה השינויים הנדרשים ב-Client?

56 HTTP TCP HTTP vs. TCP – מה עדיף? כמעט כמו תמיד, התשובה היא תלוי.
מספק יכולת להתחבר ללקוחות ללא קשר לטכנולוגיה בה הם נכתבו. מאפשר גם תקשורת מול לקוחות Legacy שזקוקים ל-ASMX. מאפשר התחברות ישירה לאתרים באמצעות AJAX. TCP באופן כללי ביותר, אם הלקוחות נפגשים עם השירות על גבי רשת אינטראנט עדיף להשתמש ב-TCP. הלקוח חייב לעשות שימוש ב-WCF. כאשר יש אפשרות לפתוח פורטים גם ב-Server וגם ב- Client. כאשר נדרשת תקשורת יעילה יותר.

57 אבל הוא לא המודל היחידי. סיכום ביניים
כל ההסברים והדוגמאות עד כה היו במודל של Request\Response. על פי מודל זה, הלקוח שולח בקשה ל-WCF וממתין לתגובה. זהו מודל ברירת המחדל של WCF. הוא הפשוט ביותר. מודל ה- Server\Client הקלאסי. הוא Stateless. אבל הוא לא המודל היחידי.

58 One-Way Operations ישנם מקרים בהם הלקוח לא זקוק לתגובה מהשרת והוא לא מתעניין בהצלחה או כישלון. במקרים אלו יש יתרון ל-One-Way. הלקוח מייצר בקשה,WCF באמצעות ה-פרוקסי מייצר את הודעת הבקשה ושולח לשרת, השרת לא מחזיר תשובה ללקוח. היתרון, הלקוח נחסם רק לפרק זמן קצר מאוד כאשר הוא שולח את הבקשה, הוא אינו צריך להמתין לתגובה. האם זה תמיד קורה? לא, לעיתים השרת עסוק מדי ואינו מקבל את הבקשה מידית. במקרה זה הלקוח ימתין עד לקבלת הבקשה על ידי השרת. (הפעלה אסינכרונית פותרת את הבעיה).

59 One-Way Operations public class Calculator : ICalculator {
public void Sum(double num1, double num2) Console.WriteLine( num1 + num2); } public void Sub(double num1, double num2) Console.WriteLine(num1 - num2); public void Mul(double num1, double num2) Console.WriteLine(num1 * num2); public void Div(double num1, double num2) Console.WriteLine(num1 / num2); [ServiceContract] public interface ICalculator { [OperationContract(IsOneWay = true)] void Add(double n1, double n2); void Subtract(double n1, double n2); void Multiply(double n1, double n2); void Divide(double n1, double n2); }

60 Stateful תקשורת שרת/לקוח היא Stateless כברירת מחדל:
ה-Client מעביר בקשה (Request) ל-Server. ה-Server מעבד את הבקשה ומעביר תגובה ל-Client (Reponse). ה-Server מנתק את הקשר עם הלקוח ואינו שומר מידע.

61 Stateful מה זה Stateful? ה-Client מעביר בקשה (Request) ל-Server.
ה-Server מעבד את הבקשה ומעביר תגובה ל-Client (Reponse). ה-Server אינו מנתק את הקשר עם הלקוח ושומר שומר מידע לטובת בקשות נוספות.

62 Stateful שלב ראשון – הגדרת Contract
שלב ראשון: כתיבת Service Contract Stateful שלב ראשון – הגדרת Contract SessionMode מאפשר להגדיר את הדרך בה ניתן להגדיר כיצד ינוהל ה- Session בין ה- Server ל-Client. ל-SessionMode ישנן מספר אפשרויות, על מנת לאפשר Stateful יש להגדיר את הערך Required. [ServiceContract(SessionMode=SessionMode.Required)] public interface IService { [OperationContract(IsOneWay = true)] void SetClientName(string name); [OperationContract] Data Request(); }

63 Stateful * מימוש הממשק IDisposable אינו חובה אולם מומלץ. שלב ראשון:
כתיבת Service Contract Stateful public class Service : IService,IDisposable { private int requestCount = 0; private string clientName; public Data Request() Console.WriteLine("Server: Count = {0}, Client Name = {1}" , requestCount, clientName); requestCount ++; Data data = new Data(); data.ClientName = clientName; data.RequestCount = requestCount; return data; } public void SetClientName(string name) clientName = name; public void Dispose() Console.WriteLine("Dispose"); * מימוש הממשק IDisposable אינו חובה אולם מומלץ. המידע שישמר בשרת שלב שני: כתיבת Data Contract [DataContract] public class Data { [DataMember] public string ClientName { get; set; } public int RequestCount { get; set; } }

64 שלב ראשון: כתיבת Service Contract Stateful השינוי היחידי ב-App.Config הוא הגדרת ה-Binding כ-wsHttpBinding. משום ש- basicHttpBinding אינו תומך ב-Sessions. <endpoint address="" binding="wsHttpBinding" contract="StatefulServiceLibrary.IService">

65 Duplex Service המודל הרגיל
כברירת מחדל תקשורת מבוססת WCF היא תקשורת Web רגילה. בתקשורת Web רגילה המודל המקובל הוא Request – Response. הלקוח מבקש בקשה מהשרת (Request) ונכנס למצב המתנה (Wait State). השרת מקבל את הבקשה, מעבד אותה ומחזיר תגובה (Response). במידה והלקוח לא מקבל תגובה בפרק זמן שנקבע מראש נוצרת חריגה (TimeOutException) WCF Service WCF client Request Response

66 Duplex Service המודל המשודרג
מאפשר ל-Client להתנהג כמו Service ול-Service להתנהג כמו Client. מתבצע באמצעות מנגנון הנקרא Callback. על מנת לתמוך ב-Callback על פרוטוקול תעבורת המידע לתמוך בדו-סיטריות (Bidirectional). basicHttpBinding אינו תומך בזה ולכן נשתמש ב- WsDualHttpBinding. WsDualHttpBinding מייצר שני צ'אנלים של HTTP אחד עבור הלקוח והשני עבור השירות. Client Server

67 Duplex Service Duplex Service מטפל בהחלפת הודעות בין אפליקציות קצה (לקוחות). כל לקוח יכול לשלוח הודעה לשאר הלקוחות בצורה עצמאית ללא התערבות של שרת. שירות Duplex יכול לשלוח הודעה באמצעות התנהגות המזכירה אירוע – event. תקשורת Duplex מתרחשת כאשר תוכנת לקוח מתחברת ל-Service לו ערוץ להתחברות ישירה. WCF Service WCF client Client call Service Service call Client

68 Duplex Service Duplex Conrtact
על מנת לממש תקשורת Duplex ה- Service Contract מכיל שני ממשקים. הראשון הוא Service Contract רגיל (כמעט) אשר מתאר את הפעולות שהלקוח יכול לבצע. השני נקרא Callback Contract שגם ממומש כממשק ותפקידו להגדיר את הפעולות שה- Service יכול להפעיל ב-Client. מה השינוי הנדרש ב- Service Contract? להגדיר את ה- Callback Contract. WCF Service WCF client Client call Service Service call Client

69 Duplex Service מה חשוב לדעת?
זאת אומרת שאם ב- WCF רגיל הלקוח יכול להיות כתוב בכל שפה או פלטפורמה, בתקשורת מבוססת Duplex גם בלקוח חייב להיות כתוב ב-.NET WCF רגיל: WCF Duplex: WCF Service WCF client Client call Service Service call Client Any Platform WCF Service WCF client Client call Service Service call Client

70 Duplex Service ae

71

72

73

74 את הסילבוס, חומרים, מצגות ניתן להוריד ב: www.corner.co.il


Download ppt "אפליקציות אסינכרוניות ל-Windows 10"

Similar presentations


Ads by Google