WCF 4 (Windows Communication Foundation) for Beginner – part 5

6 בינואר 2011

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



ללמוד WCF 4 פרק 5 – המשך התעמקות בקובץ הקונפיג.

 

 

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


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

יצירת Binding מותאם אישית.

האופצייה להגדיר יותר מ – endpoint אחד לשירות.

הכרת האלמנט host ו – baseAddress.

הכירות עם protocolMapping.

בפרק הבא.

 

 

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


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

בפרק הרביעי התחלנו להבין את החלקים השונים של קובץ הקונפיג ומה המשמעות של Binding ו – Behavior.

 

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

 

 

יצירת Binding מותאם אישית.


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

 

במקרה כזה נוכל להגדיר הגדרה כזאת (בתוך המקטע של bindings)

 



<customBinding>


  <binding name="HTTPbinary">


    <binaryMessageEncoding />


    <httpTransport transferMode="Streamed" />


  </binding>


</customBinding>


 


אפשר לראות שהגדרנו שהמידע יעבור בבינארי ובפרוטוקול http כשהמידע יעבור ב – stream (למשל אם נרצה לבנות נגן שמתקשר עם השרת כדי לקבל את הסרט שצריך לנגן)

 

כעת נצטרך להגדיר את ה – binding באלמנט service

 



<endpoint address="http://localhost:3333/MyBinaryCalcService"


          binding="customBinding"


          bindingConfiguration="HTTPbinary"


          contract="Contarcts.ICalc">


 


</endpoint>


 

 

 

האופצייה להגדיר יותר מ – endpoint אחד לשירות.


חשוב לזכור שזה שהגדרנו endpoint אחד לא מונע מאיתנו להגדיר על אותו שירות עוד endpoints, למשל:

 




<services>


  <service name="Service.Calc"


            behaviorConfiguration="calcServiceBehavior">


    <endpoint bindingConfiguration="webHttpBindingCalcBinding"


              behaviorConfiguration="calcEpBehavior"


              address="http://localhost:8412/MyCalcService"


              binding="webHttpBinding"


              contract="Contarcts.ICalc">


 


    </endpoint>


    <endpoint address="http://localhost:3333/MyBinaryCalcService"


              binding="customBinding"


              bindingConfiguration="HTTPbinary"


              contract="Contarcts.ICalc">


 


    </endpoint>


    <endpoint address="http://localhost:2222/MyBasicCalcService"


              binding="basicHttpBinding"


              contract="Contarcts.ICalc">


 


    </endpoint>


  </service>


</services>





כעת יש לנו שלוש יציאות לאותו שירות,

אחת ב – webHttpBinding עבור AJAX

אחת בבינארי

ואחת ב – basicHttp לעבודה בפרוטוקול SOAP (כמו Web Service)

 

 

הכרת האלמנט host ו – baseAddress.


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

 

 



<services>


  <service name="Service.Calc"


            behaviorConfiguration="calcServiceBehavior">


    <host>


      <baseAddresses>


        <add baseAddress="http://localhost:8412"/>


      </baseAddresses>


    </host>


    <endpoint bindingConfiguration="webHttpBindingCalcBinding"


              behaviorConfiguration="calcEpBehavior"


              address="MyCalcService"


              binding="webHttpBinding"


              contract="Contarcts.ICalc">


 


    </endpoint>


    <endpoint address="MyBinaryCalcService"


              binding="customBinding"


              bindingConfiguration="HTTPbinary"


              contract="Contarcts.ICalc">


 


    </endpoint>


    <endpoint address="MyBasicCalcService"


              binding="basicHttpBinding"


              contract="Contarcts.ICalc">


 


    </endpoint>


  </service>


</services>


 


כאמור כל baseAddress מתייחס לפרוטוקול ספציפי (אחד עבור http ואם נרצה נוכל להוסיף אחד עבור tcp וכו')

 

 

 

הכירות עם protocolMapping


למעשה ב – WCF 4 לא באמת צריך להגדיר endpoint, במידה ואנחנו רוצים להחצין endpoint בסיסי בלי הגדרות מיוחודות כל מה שצריך זה להגדיר baseAddress, למשל:

 



<services>


  <service name="Service.Calc"


            behaviorConfiguration="calcServiceBehavior">


    <host>


      <baseAddresses>


        <add baseAddress="http://localhost:8412/CalcService"/>


      </baseAddresses>


    </host>


  </service>


</services>


 


יחשוף בצורה אוטומטית endpoint של basicHttpBinding עבור השירות, מכיוון שהוא מתבסס על הקידומת של הכתובת ב – baseAddress.

במידה ונרצה לשנות את ההגדרות ברירות המחדל של ה – endpoints האוטומטיים, נצטרך להוסיף אלמנט בשם protocolMapping

 



<protocolMapping>


  <add scheme="http" binding="customBinding" bindingConfiguration="HTTPbinary"/>


</protocolMapping>


 


כעת הגדרנו שכל הכתובות שיחשפו כ – http מבלי שיהיה להם binding מפורש ייתיחסו לסוג ה – binding של HTTPbinary (מה שהגדרנו מקודם)

 

 

 

בפרק הבא.


בפרק הבא נעזוב לבנתיים את הקונפיגורצייה ונראה כיצד מארחים את השירות במגווון המארחים של windows החל מ – winform עד ל – windows service ואפילו ב – IIS.

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

כתיבת תגובה

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

תגובה אחת

  1. יריב 14 בפברואר 2011 ב 15:29

    סבבה של אתר עם זאת שאלה.
    כעקרון אין בעייה גם לחשוף על אותו שירות גם 2 ENDPOINT שמתייחסים ל CONTRACT שונים.

    העיה שלי היא כזאת.

    יש לי HOST שחושף בקובץ הקונפיג שלו X שירותים.
    כל הממשקים של השירותים הנ"ל מוגדרים על אותו NAMESPACE תחת DLL אחד.
    עד כה סבבה.
    יש לי קליינט שמעוניין ב 2 שירותים , אחד לטיפול בקליינטים ואחד לטיפול בסאונד.

    אם אני מנסה לעשות זאת דרך השימוש ב Service References יש לי בעייה. Service References פונה לכתובת אחת בשרת שחושפת service אחד , האם אני צריך להוסיף עוד Service References לsrvice השני? גם פה יש בעייה כי אני לא יכול ליצור עוד Service References עם אותו namespace (שהרי הממשקים מוגדרים תחת אותו namespace) .

    הקיצר , איך אני פותר את הגזירה הזאת?

    הגב