WCF (Wndows Communication Foundation) for Beginner – part 1

28 בדצמבר 2010

תגיות: ,
7 תגובות




הקדמה:



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

בתקופה הקרובה אני אשתדל לפרסם מידי יום פרק נוסף על WCF ואני מקווה שסדרה זו תואיל לאנשים המחפשים מידע על WCF.

 

למי שלא יודע מה זה WCF, לפני שנתחיל נעשה יישור קו קטן, WCF זה ראשי תיבות של Wndows Communication Foundation, הרבה לפני ש – WCF הגיע לאויר העולם יכולנו לכתוב אפליקציות מבוזרות – כלומר – אפליקציות שבצד אחד יש לקוח ובצד שני יש שרת והם מתקשרים ביניהם, התקשורת התבצעה במגוון דרכים , הפופולרית היא כמובן WebService אבל יש עוד הרבה דרכים כמו Remoting ואחרים, כמובן שבכל צורת תקשורת צריך לבחור את הפרוטוקול ולכל צורת תקשורת יש את היתרונות והחסרונות שלה, החל מניהול תהליכים עד לעניני Security.

 

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

 

כמובן שזה נשמע פשוט מאוד, אך בפועל למי שלא מכיר WCF קובץ הקונפיג יכול להיות סיבוך אחד גדול, ולכן בסדרת פוסטים זאת ,אני אנסה לתת הסבר פשוט על מה זה ואיך משתמשים ב – WCF.

 

 

ללמוד WCF פרק 1 – מה זה Service ומה זה Contract.

 

 

רשימת נושאים בפרק 1:


מה המשמעות של Service.

מה זה Contract ומה ההבדל בין ServiceContract לבין OperationContract.

כיצד מתחילים לכתוב Service.

מה זה DataContract ומה זה DataMember.

 

 


מה המשמעות של Service.


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

למשל – נניח שאננו רוצים שירות של מחשבון נצטרך לממש מתודה שמקבלת שני מספרים ומחזירה מספר.

 

מה זה Contract ומה ההבדל בין ServiceContract לבין OperationContract.


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

Contract זה בסך הכול מילה אחרת ל – Interface, למעשה אנחנו צריכים להגדיר Interface שמחצין את אותם מתודות שיהיה ניתן להפעיל מרחוק, כמובן שלא כל Interface מוכר כ – Contarct שמייצא שירותים החוצה, כדי להגדיר שה – Interface הוא WCF Contract צריך להוסיף מעל ה – Intreface את ה – Attribute של ServiceContarct, למשל

 



[ServiceContract]


public interface ICalc


{


 


}



כשכתבנו את ה – Attribute על ה – Interface הגדרנו אותו כממשק שמחצין החוצה את המתודות שלו ללקוחות.

זה עדיין לא מספיק מכיוון שיתכן שאנו לא רוצים לחשוף החוצה את כל המתודות שיש ב – Interface, ולכן כל מתודה שנרצה שתהיה מוחצנת החוצה נוסיף לה את OperationContract, למשל:

 



[ServiceContract]


public interface ICalc


{


    [OperationContract]


    public int Add(int a, int b);


}


 

כיצד מתחילים לכתוב Service.


בשלב ראשון צריך להגדיר את ה – Contract, מאוד מומלץ לעשות את זה בפרוייקט נפרד (Assembly) ולא לכתוב באותו פרוייקט גם את ה – Contract וגם את המימוש שלו.

 

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

 

 


מה זה DataContract ומה זה DataMember.


לפעמים המתודות שמוגדרות ב – Contract צריכות לקבל או להחזיר אובייקטים, למשל:

 



[ServiceContract]


public interface ICalc


{


    [OperationContract]


    public int Add(int a, int b);


 


    [OperationContract]


    public int Add2(Dolar a, Shekel b);


}


 


(בפוסטים אחרים נדבר על איך אפשר להשתמש במנגנון ה – Overload ולא לתת שמות כמו Add2)

הבעייה עם מה שראיתם היא – שהמחלקות Dolar ו – Shekel צריכות לעבור סרילזיציה, כדי לאפשר זאת צריך לכתוב את המחלקות בצורה הבאה


[DataContract]


public class Dolar


{


    [DataMember]


    public int Value { get; set; }


}


 


[DataContract]


public class Shekel


{


    [DataMember]


    public int Value { get; set; }


}


 


למעשה כל אובייקט (שלנו) שנרצה להעביר ב – WCF צריך את ה – Attribute של DataContract ובנוסף כל מאפיין של אותו מחלקה שנרצה שיעבור בין הלקוח לשרת צריך להוסיף לו DataMember.

 

 

בחלק הבא – אסביר כיצד מארחים שירות של WCF ברשת כך שלקוחות יוכלו אכן לפנות אליו.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

7 תגובות

  1. Ido Flatow28 בדצמבר 2010 ב 12:08

    הי שלמה,
    הערה קטנה לגבי השימוש ב-DataContract: החל מ-.net 3.5 sp1 אין חובה להשתמש ב-DataContractAttribute ו-DataMemberAttribute בשביל לאפשר סריאליזציה. ה-DataContractSerializer יבצע סריאליזציה גם אם Attributes אלו לא קיימים.

    ניתן לקרוא יותר על כך בלינק הבא:
    http://www.pluralsight-training.net/community/blogs/aaron/archive/2008/05/13/50934.aspx

    הגב
  2. חיים21 בספטמבר 2011 ב 13:19

    שלום,
    תודה על הבלוג היפה!!
    אני מעוניין ללמוד WCF, איך אני פותח את שני הפרויקטים שהסברת בפרק זה ,כלומר open->new->project מה הלאה מה לבחור ?
    ואם צריך להוסיף using כדי שיזהה את ה WCF בפרויקט של Contract???

    הגב
  3. משה2 בפברואר 2012 ב 20:42

    תודה רבה על הזמן וההשקעה! בלוג מעולה!

    הגב
  4. שירן4 במרץ 2013 ב 2:47

    תמיד נחמד שיש אנשים שמקדישים מזמנם כדי לכתוב הסברים בעברית!!
    תודה רבה וכל הכבוד!!

    הגב
  5. בצלאל18 באוגוסט 2013 ב 3:53

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

    הגב
  6. חיה ליבל10 בנובמבר 2014 ב 17:03

    תיקון : תועיל במקום תואיל

    הגב
  7. זהבי15 במאי 2017 ב 13:18

    רציתי לשאול אם אפשר לבקש עזרה בנושא אחר אבל קשור לwcf
    פרויקט שעלי להגיש ואין לי מושג איך עושים אותו, אני למדתי את השפות היותר פשוטות, ג'אבה, סישארפ ועוד, והנה תוכנו:
    יש לצרף את האלגוריתם MatLab לשרת RESTFul שאפליקציית iOS יכולה לתקשר איתו עם בקשות HTTP. האלגוריתם MatLab קולט תמונה, ומגיב בטקסט
    האם אתה יודע כיצד לעשות זאת? תודה

    הגב