WCF Serialization Issue

8 בדצמבר 2009

תגיות: , , ,
תגובה אחת

WCF Serialization Issue

אחת השאלות הכי שכיחות שאני שומע היא, למה צריך לשים Attribute Known Type על Base Class?

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

נגדיר את הממשק הבא:

clip_image002

כאשר קוראים ל- Proxy.GetMedia( m ) נוצרת הודעת SOAP שנשלחת לשירות. לדוגמא:

clip_image004

כמה מושגים שכדאי להסביר:

1. <GetMedia> – השם נלקח משם המתודה או מתוך ה= Name אשר הוגדר ב- OperationContract, לדוגמא ( [OperationContract(Name=”GetMedia”)] ).

2. <media> – השם נלקח משם ה- argument של המתודה.

איך ה-WCF יודע ,בצד השירות, לבחור את הטיפוס Media? כאשר יוצרים את ServiceHost הוא עובר ב- Reflection על כל המתודות שמסומנות ב- OperationContract ושומר את החתימה שלהן. באופן זה יש לו את היכולת לחבר את <media> ל- argument הנכון במתודה ולזהות את הטיפוס של ה- <media>. מכאן נובע שאם אתם שולחים מחלקה שיורשת מ- Media עדיין השם של ה- XML Node לא ישתנה שכן ה- argument נשאר זהה (<media> ).

כלומר, צריך לתת "רמז" ל-WCF לאיזה מחלקה אנחנו מתכוונים….. וזה מתקבל ע"י Known Type Attribute שמגדיר ל- DataContractSerializer לשתול רמז בהודעה.

ראה דוגמא:

clip_image006

אנחנו רואים שעכשיו יש רמז: <media type="CD"> שעוזר ל- DataContractSerializer בצד השרת להבין שמדובר במחלקה שיורשת את Media ( את זה הוא יודע מן המתודה ) ושהשם של המחלקה הוא CD.

האם חייבים להשתמש ב- Known Type?

התשובה היא לא, אפשר לתחמן J.

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

אשמח לענות לשאלות לכל מי שרוצה, אני זמין גם בקבוצה שלי בלינקדאין – I Love C# אשמח אם תצטרפו.

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

כתיבת תגובה

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

תגובה אחת

  1. Rotem Bloom9 בדצמבר 2009 ב 17:20

    אחלה של פוסט תודה

    הגב