מדריך WCF – הבנה החלקים של קובץ הקונפיג

רשימת נושאים בפרק זה

סיכום הפרקים הקודמים
ממה מורכב האלמנט Binding
סוגי ה – Bindings השונים
הבנת המאפיין bindingConfiguration של אלמנט Endpoint
הבנת המאפיין behaviorConfiguration של אלמנט Endpoint
הבנת המאפיין behaviorConfiguration של אלמנט Service

סיכום הפרקים הקודמים

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

כמו כן דברנו קצת על הקונפיג והכרנו את המושג endpoint ודברנו על זה שהוא מורכב מ –  Address, Binding, Contract.  (ראשי תיבות ABC)

כשה – Address חושף את הכתובת שה – host מאזין.

ה – Binding מספר באיזה פרוטוקול מאזינים.

וה – Contract מספר אילו מתודות חשופות.

בנוסף דברנו על הלקוח שיכול להשתמש בשירות על ידי שימוש ב – ChannelFactory או בצורה אוטומטית על ידי הוספת Service Reference.

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

ממה מורכב האלמנט Binding

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

Transport – אחראי על הפרוטוקול עצמו – כלומר – http, tcp, msmq ועוד.

Encoder – האם המידע יעבור ב – Text, Binary, Custom.

Protocol – אחראי על שאר הדברים כמו Security, Transactions, ואחרים.

למעשה ב – Transport וב – Encoder תמיד יש רק אופציה אחת לבחור לעומת זאת ב – Protocol אפשר לבחור יותר מאחד ולמעשה זה סוג של Channel וההודעה שנשלחת לשירות עוברת בין ה – Protocols השונים שקבענו ורק במידה וכולם מאשרים את ההודעה זה מגיע לשירות.

סוגי ה – Bindings השונים.

יש הרבה Bindings מוגדרים מראש במערכת ולכל אחד מהם תפקיד מוגדר, ואנחנו צריכים לבחור מתי נרצה להשתמש בכל אחד מהם, ה – Binding מגיע עם ברירות מחדל למאפיינים שלו ואנחנו יכולים לבחור לשנות אותם (עוד מעט נראה איך).

במידה ואין אף Binding העונה לצרכים שלנו (למשל במידה ונרצה להגדיר שהשירות יעבוד ב – http אבל שהמידע יעבור בבנארי) נוכל להגדיר Binding מותאם אישית (בפרק הבא נראה כיצד).

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

בלינק הזה תוכלו למצוא רשימה (חלקית) של ההבדלים בין סוגי ה – Bindings.

הבנת המאפיין bindingConfiguration של אלמנט Endpoint

כדי לקנפג את המאפיינים של Binding שאנחנו משתמשים בו נצטרך להוסיף את ההגדרות לקובץ הקונפיג.למשל:

<bindings>
<
webHttpBinding>
<
binding name="webHttpBindingCalcBinding"
crossDomainScriptAccessEnabled="true"
openTimeout="00:01:00" >
<
security mode="None"></security>
</
binding>
</
webHttpBinding>
</
bindings
>

אמנם בדוגמאות בפרקים הקודמים עבדנו עם basicHttpBinding כעת נעבור להשתמש ב – webHttpBinding – (ההבדל המרכזי ביניהם ש – basicHttpBinding משתמש בפרוטוקול של SOAP כדי להעביר מידע ולכן אי אפשר להפעיל את המתודות שלו מ – Javascript בעזרת AJAX).

אפשר לראות שהגדרנו את המאפיינים הבאים:

name – אפשר להגדיר יותר ממופע אחד של אותו binding וכל אחד עם מאפיינים שונים אבל לכל אחד צריך שיהיה name אחר, כדי שנוכל להתייחס אליו ב – endpoint.

crossDomainScriptAccessEnabled – המגדיר שנוכל להפעיל את המתודות ב – javascript גם משרת אחר שבו יושב השירות.

openTimeout – הגדרנו שהשירות יכול להיות פתוח דקה, ובמידה ולוקח למתודה יותר מדקה אחת נקבל timeout exception.

כמו כן פתחנו אלמנט של security שהגדרנו אותו כ – none, מה שאומר שהשירות אינו מאובטח.

כעת באלמנט ה – endpoint נוכל להגדיר שהמאפיין bindingConfiguration יהיה webHttpBindingCalcBinding.

<endpoint bindingConfiguration="webHttpBindingCalcBinding"
          address="http://localhost:8412/MyCalcService"
          binding="webHttpBinding"
          contract="Contarcts.ICalc"
>

שימו לב שהמאפיין binding שהיה עד היום basicHttpBinding הוחלף ל – webHttpBinding מכיוון שהערך של המאפיין binding חייב להיות תואם למאפיין bindingConfiguration.

(למעשה ב – WCF 4.0 אפשר לעבוד עם ברירות מחדל – כלומר – אפשר לא להגידר את המאפיין bindingConfiguration במידה ולא נתן שם ערך למאפיין name)

הבנת המאפיין behaviorConfiguration של אלמנט Endpoint

מעבר להגדרות שניתן לתת ב – bindingConfiguration שלכל סוג של binding יש הגדרות משלו, יש גם את ה – behaviorConfiguration.

Behaviors הם למעשה חלקים בתוך ה – Channel של ה – Binding שאנחנו כמפתחים יכולים להתערב ולהוסיף הגדרות נוספות, למשל נוכל לכתוב את הקוד הבא:

<behaviors>
<
endpointBehaviors>
<
behavior name="calcEpBehavior">
<
dataContractSerializer maxItemsInObjectGraph="500"/>
<
enableWebScript />
</
behavior>
</
endpointBehaviors>
</
behaviors
>

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

כמובן שיש עוד הרבה הגדרות נוספות שניתן להגדיר.

כעת מה שנצטרך לכתוב זה:

<endpoint bindingConfiguration="webHttpBindingCalcBinding"
          behaviorConfiguration="calcEpBehavior"
          address="http://localhost:8412/MyCalcService"
          binding="webHttpBinding"
          contract="Contarcts.ICalc"
>

הבנת המאפיין behaviorConfiguration של אלמנט Service

כמו שיש התנהגות שנגדיר ל – Binding נוכל גם להגדיר התנהגות ל – Service, למשל במידה ונכתוב את הקוד הבא:

<behaviors>
<
endpointBehaviors>
<
behavior name="calcEpBehavior">
<
dataContractSerializer maxItemsInObjectGraph="500"/>
<
enableWebScript />
</
behavior>
</
endpointBehaviors>
<
serviceBehaviors>
<
behavior name="calcServiceBehavior">
<
serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8412/MyCalcService/Help"/>
<
serviceDebug includeExceptionDetailInFaults="true"  />
</
behavior>
</
serviceBehaviors>
</
behaviors
>

בעזרת ההגדרת של serviceMetadata אנחנו חושפים את ה – wsdl של השירות מה שגורם לכך שנוכל להשתמש ב – Add Service Referece עבור השירותים שלנו (כפי שמתואר בפרק הקודם)

בנוסף בהגדרה של serviceDebug אנחנו מגדירים הגדרות שונות כדי שנוכל לדבג יותר טוב את השירותים, למשל המאפיין includeExceptionDetailInFaults מגדיר במידה והלקוח מקבל שגיאה מה – Service האם המידע יכלול את פרטי השגיאה האמיתית.

כעת נוכל לכתוב את הקוד הבא:

<services>
<
service name="Service.Calc"
   behaviorConfiguration="calcServiceBehavior">
<
endpoint bindingConfiguration="webHttpBindingCalcBinding"
   behaviorConfiguration="calcEpBehavior"
   address="http://localhost:8412/MyCalcService"
   binding="webHttpBinding"
   contract="Contarcts.ICalc">

</endpoint>
</
service>
</
services
>

חשוב לדעת – בשונה מ – endpointBehaviors שאפשר להגדיר את הכול מתוך הקונפיג, ה – serviceBehaviors מחולק לשניים, חלק שמגדירים בקונפיג (בדרך כלל דברים שמשפיעים על ה – host והסביבה) וחלק שמגדירים כ – attributes על השירות (בדרך כלל דברים שמשפיעים על אופן המימוש) למשל:

namespace Service
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Calc : ICalc
{
public int Add(int a, int b)
{
return a + b;
}

public int Sub(int a, int b)
{
return a - b;
}
}
}

כרגע הוגדר שכל קריאה לאחת מהמתודות של השירות תייצר context חדש ולא יהיה קשר בין קריאות קודמות (אפילו של אותו proxy).

היות שההגדרות האלו משפיעים בצורה ישירה על אופן המימוש (במקרה שהגדרנו PerCall לא נוכל לשמור משתנים גלובליים ברמת השירות מכיוון שעבור כל קריאה יש יצירה חדשה של המחלקה)

 

בפרק הבא נוסיף ונדבר על עוד כמה אלמנטים מעניינים בקונפיג.

תגיות:

תגובות בפייסבוק