Windows 10 WCF Windows Communication Foundation 1 Evolutions

  • Slides: 74
Download presentation
 אפליקציות - אסינכרוניות ל Windows 10 WCF - Windows Communication Foundation 1

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

Evolutions - קצת היסטוריה Socket-based Models Remote Procedure Calls DCOM CORBA Web Services and.

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

: שלב ראשון כתיבת Service Contract בשלושה שלבים WCF בניית שירות . (Add->New Item->Interface)

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

: שלב ראשון כתיבת Service Contract { } בשלושה שלבים WCF בניית שירות public

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

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 -

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 - ב <configuration> App. Config הקובץ <startup> <supported. Runtime version="v 4. 0" sku=". NETFramework, Version=v 4. 5" /> Host- מעבירים את הקובץ ל </startup> ( )אסור שיישאר בפרויקט השירות <system. service. Model> <services> <service name="Calculator. Service. Calculator" > <endpoint address="http: //localhost: 8733/Calculator. Service/Calculator. svc" binding="basic. Http. Binding" contract="Calculator. Service. ICalculator"></endpoint> הגדרת </service> </services> Endpoint <behaviors> הגדרת <service. Behaviors> Behavior <behavior> <service. Metadata http. Get. Enabled="true" http. Get. Url="http: //localhost: 8733/Calculator. Service/Calculator. svc"/> </behavior> </service. Behaviors> </behaviors> </system. service. Model> </configuration> 30

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 -

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 - ב אין מה , מגדיר את גרסת התשתית , Visual Studio § החלק הראשון מתווסף על ידי . לגעת בו <startup> <supported. Runtime version="v 4. 0" sku=". NETFramework, Version=v 4. 5" /> </startup> : Endpoint - § החלק השני מגדיר את ה <services> <service name="Calculator. Service. Calculator" > <endpoint address="http: //localhost: 8733/Calculator. Service/Calculator. svc" binding="basic. Http. Binding" contract="Calculator. Service. ICalculator"></endpoint> </services> ולכן צריך להגדיר שם ייחודי Services התוכנה המארחת יכולה לארח מספר – Name § Contract - שם המחלקה המממשת את ה + השם מורכב ממרחב השמות . לכל אחד . (Namespace. Name. Class. Name) 31

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 -

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 - ב <services> <service name="Calculator. Service. Calculator" > <endpoint address="http: //localhost: 8733/Calculator. Service/Calculator. svc" binding="basic. Http. Binding" contract="Calculator. Service. ICalculator"></endpoint> </services> . “ABC” - < נגדיר את ה endpoint> § בתגית HTTP- הכתובת מתחילה ב , מאזין Host- מגדיר את הכתובת בה ה address § המאפיין Binding - וזה משפיע על השיטה של ה בדוגמה הפרוטוקול יהיה , מגדיר את פרוטוקול התקשורת Binding § המאפיין . בסיסי http דהיינו פרוטוקול , basic. Http. Binding נחשף בשמו Contract- ה , לחשוף Contract איזה Host- מורה ל contract § המאפיין : המלא . Namespace. Name. Interface. Name 32

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 -

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2013 - ב <behaviors> <service. Behaviors> <behavior> <service. Metadata http. Get. Enabled="true“ http. Get. Url="http: //localhost: 8733/Calculator. Service/Calculator. svc"/> </behavior> </service. Behaviors> </behaviors> , WSDL- לחשוף גם את ה Host- מורה ל base. Addresses § הגדרת http: //localhost: 8733/Design_Time_Addresses/Calculator. Service/Calculat or/ . . . הגיע זמן לקוח , § סיימנו עם המארח 33

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2015 -

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2015 - ב תחילת - הגדרת ה Service <configuration> <app. Settings> <add key="aspnet: Use. Task. Friendly. Synchronization. Context" value="true" /> </app. Settings> <system. web> <compilation debug="true" /> </system. web> <system. service. Model> <services> <service name="Calculator. Service. Calculator"> <host> <base. Addresses> <add base. Address = "http: //localhost: 8733/Design_Time_Addresses/Calculator. Service/Calculator/" /> </base. Addresses> </host> <endpoint address="" binding="basic. Http. Binding" contract="Calculator. Service. ICalculator"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mex. Http. Binding" contract="IMetadata. Exchange"/> </services> <behaviors> <service. Behaviors> <behavior> <service. Metadata http. Get. Enabled="True" https. Get. Enabled="True"/> <service. Debug include. Exception. Detail. In. Faults="False" /> </behavior> </service. Behaviors> </behaviors> </system. service. Model> </configuration> App. Config הקובץ Host- מעבירים את הקובץ ל ( )אסור שיישאר בפרויקט השירות - שם ה Service - הגדרת ה Endpoint סיום הגדרת Service- ה - כתובת ה Service הגדרת Behavior 34

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2015 -

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

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2015 -

: שלב שני הגדרת מארח בשלושה שלבים WCF בניית שירות Visual Studio 2015 - ב - הכתובת של ה Service <base. Addresses> <add base. Address = "http: //localhost: 8733/Design_Time_Addresses/Calculator. Service/C alculator/" /> </base. Addresses> <endpoint address="" binding="basic. Http. Binding" contract="Calculator. Service. ICalculator"> <identity> - הגדרת ה <dns value="localhost"/> - ל Endpoint </identity> Service </endpoint> <endpoint address="mex" binding="mex. Http. Binding" contract="IMetadata. Exchange"/> Service - הפניה ל Contract - הגדרת ה - ל Endpoint Metadata חשיפת Service - על ידי ה WSDL כמו 36

 Data Contract § Data. Contract נתמכים על ידי מנגנון ה. Serialization - §

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

Data Contract ? Data. Contract איך מגדירים מעטרים אותו בשני Data Contract - כ

Data Contract ? Data. Contract איך מגדירים מעטרים אותו בשני Data Contract - כ enum מבנה או / כדי להגדיר מחלקה : Attributes [Data. Contract] public class My. Class { [Data. Member] public string Data 1 { get; set; } [Data. Member] public int Data 2 { get; set; } [Data. Member] public double Data 3 { get; set; } [Data. Member] public List<int> Data 4 { get; set; } } . enum מבנה או / ברמת המחלקה – Data. Contarct . 1 מגדיר את השדות או המאפיינים – Data. Member. שישתתפו בתהליך הסריאליזציה . 2 Collection. Data. Contract : נגדיר List כדי להגדיר [Collection. Data. Contract] public class My. List: List<My. Type> { } 42

Data Contract הטיפוסים הנתמכים Int 16, Int 32, Int 64, Boolean, Byte, Char, String,

Data Contract הטיפוסים הנתמכים Int 16, Int 32, Int 64, Boolean, Byte, Char, String, ) CLR § הטיפוסים הבסיסיים של . (Single, Decimal, Double, Object, Date. Time, UInt 16, UInt 32, UInt 64 enum § Delegate § (Generics )כולל § מערכים ורשימות ISerializable § טיפוסים המממשים את הממשק 43

: שלב ראשון כתיבת Data Contract – שלב ראשון . Currency. Model חדש ונקרא

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

: שלב שני כתיבת Business Layer Data Contract – שלב שני . Business Layer-

: שלב שני כתיבת Business Layer Data Contract – שלב שני . Business Layer- הפרויקט שלנו זקוק ל תבצע את חישובי , שכבה שתקרא את המידע מהשרת של בנק ישראל ותפענח אותו . . המרות המטבעות . Currency. BL חדש ונקרא לו Class Library § נפתח פרויקט . שכתבנו בשלב הקודם Currency. Model § נוסיף ייחוס לאסמבלי . Currencies. Manager § נוסיף מחלקה הנקראת public class Currencies. Manager { private Currency. List Parse. XML() { … } public Currency. List Get. Currency. List() { … } public List<string> Get. Currencies. Name. List() { … } public double Convert(Currency source, Currency dest, double amount) { … } } 48

: שלב שלישי כתיבת Service – שלב שלישי . כתיבת השירות עצמו . Currency.

: שלב שלישי כתיבת Service – שלב שלישי . כתיבת השירות עצמו . Currency. Service. Model חדש ששמו WCF Service Library נפתח פרויקט . שכתבנו בשלב הקודם Currency. View. Model § נוסיף ייחוס לאסמבלי : ICurrency. Service האמצעות ממשק הנקרא Service. Contract - § נוסיף את ה [Service. Contract] public interface ICurrency. Service { [Operation. Contract] Currency. List Get. All. Currencies(); [Operation. Contract] Currency Get. Currency(string currency_name); [Operation. Contract] double Convert(Currency source, Currency dest, double amount); } 49

: שלב שלישי כתיבת Service – שלב שלישי . כתיבת השירות עצמו } public

: שלב שלישי כתיבת Service – שלב שלישי . כתיבת השירות עצמו } public class Currency. Service : ICurrency. Service { public Currency. List Get. All. Currencies() { Currencies. Manager manager = new Currencies. Manager(); return manager. Get. Currency. List(); נוסיף מחלקה , נממש את הממשק : Currency. Service הנקראת public Currency Get. Currency(string currency_name) { throw new Not. Implemented. Exception(); } } public double Convert(Currency source, Currency dest, double amount) { Currencies. Manager manager = new Currencies. Manager(); return manager. Convert(source, dest, amount); } 50

: שלב חמישי לקוח – שלב חמישי public partial class Main. Window : Window

: שלב חמישי לקוח – שלב חמישי public partial class Main. Window : Window { private Currency. Service. Client currency. Service = new Currency. Service. Client(); private Currency. List currency. List; הפרוקסי private Currency source. Currency; private Currency dest. Currency; public Main. Window() - מחלקות המוגדרות ב { Data. Contract Initialize. Component(); Init(); } private void Init() { קריאה לשירות currency. List = currency. Service. Get. All. Currencies(); foreach(var item in currency. List) { lst. Source. Currencies. Items. Add(item. Country + " - " + item. Name); lst. Dest. Currencies. Items. Add(item. Country + " - " + item. Name); } } : לדוגמה 53

TCP Binding. מתבצע רק בקובץ הקונפיג TCP- ל HTTP - § שינוי הפרוטוקול מ

TCP Binding. מתבצע רק בקובץ הקונפיג TCP- ל HTTP - § שינוי הפרוטוקול מ . אין צורך לקמפל מחדש , § אין צורך לשנות את הקוד ? מה נשנה בקובץ קונפיג : Base. Address- § את ה <base. Addresses> <add base. Address = "net. tcp: //localhost: 8733/Calculator. Service/Calculator/" /> </base. Addresses> : endpoint- § את ה <endpoint address="" binding="net. Tcp. Binding“ contract="Calculator. Service. ICalculator"> : Metadata Exchange- § וגם את זה של ה <endpoint address="mex" binding="mex. Tcp. Binding" contract="IMetadata. Exchange"/> HTTP באמצעות Metadata § ונמנע קבלת 54

One-Way Operations One-Way [Service. Contract] public interface ICalculator { [Operation. Contract(Is. One. Way =

One-Way Operations One-Way [Service. Contract] public interface ICalculator { [Operation. Contract(Is. One. Way = true)] void Add(double n 1, double n 2); [Operation. Contract(Is. One. Way = true)] void Subtract(double n 1, double n 2); [Operation. Contract(Is. One. Way = true)] void Multiply(double n 1, double n 2); [Operation. Contract(Is. One. Way = true)] void Divide(double n 1, double n 2); } public class Calculator : ICalculator { public void Sum(double num 1, double num 2) { Console. Write. Line( num 1 + num 2); } public void Sub(double num 1, double num 2) { Console. Write. Line(num 1 - num 2); } public void Mul(double num 1, double num 2) { Console. Write. Line(num 1 * num 2); } public void Div(double num 1, double num 2) { Console. Write. Line(num 1 / num 2); } } 59

: שלב ראשון כתיבת Service Contract Stateful Contract הגדרת – שלב ראשון [Service. Contract(Session.

: שלב ראשון כתיבת Service Contract Stateful Contract הגדרת – שלב ראשון [Service. Contract(Session. Mode=Session. Mode. Required)] public interface IService { [Operation. Contract(Is. One. Way = true)] void Set. Client. Name(string name); } [Operation. Contract] Data Request(); מאפשר להגדיר את הדרך Session. Mode § בין Session - בה ניתן להגדיר כיצד ינוהל ה . Client- ל Server - ה על , ישנן מספר אפשרויות Session. Mode- § ל יש להגדיר את הערך Stateful מנת לאפשר . Required 62

: שלב ראשון כתיבת Service Contract , public class Service : IService, IDisposable {

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

: שלב ראשון כתיבת Service Contract Stateful. ws. Http. Binding- כ Binding- הוא הגדרת

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

Duplex Service § ae 70

Duplex Service § ae 70

71

71

72

72

73

73