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

9 בפברואר 2011

תגיות: ,
4 תגובות


 


ללמוד WCF 4 פרק 13 – נקודות על אירוח WCF ב – IIS

 

(למעשה פרק זה היה צריך לבוא מיד אחרי פרק 6 (המדבר על אירוח) אבל לצערי לא הכרתי עדיין את הנושא עד שנתקלתי בו בעבודתי והגעתי  למאמר הבא ב – MSDN שעזר לי להבין דברים קצת יותר טוב)

 

 

נושאים בפרק 13.


הסבר על אירוח שירות ב – IIS.

לאפשר לגשת מ – WCF Service ל – HttpContext.

לאפשר לגשת מ – WCF Service ל – Session.

 

 


הסבר על אירוח שירות ב – IIS.


דברנו בפרק 6 על אירוח של שירותים בפלטפורמות שונות כמו Console Application, Windows Service ועוד, ראינו שהאירוח הטוב ביותר הוא ב – IIS, מכיוון שהוא מכיל כבר מנגנונים להתאוששות משגיאות, סגירה של השירות כשאף אחד לא משתמש בזה, מעקב אחרי ביצועים ועוד, כמו כן ראינו שהחל מ – Windows Vista ומעלה ניתן לארח ב – IIS גם bindings שאינם http וזאת בעזרת ההגדרה Enabled Protocols בהגדרות של האפליקצייה.

 

ישנם כמה הבדלים בין שירותי web רגילים לבין שירותי wcf המתארחים ב – IIS.


ההגדרות שאנו מגדירים בקונפיג במקטע ה – Authentication.

גישה למידע שנשמר ב – session.

גישה למידע שנשמר ב – cache.

גישה ל – HttpContex.Current.

גישה למידע ב – AppSettings.

 

בשירותי WCF המתארחים ב – IIS כברירת מחדל אין גישה לכל המידע שהזכרתי מקודם, מכיוון שהתהליך (שנקרא mixed mode) עובד בצורה הבאה:

מודול מיוחד שרשום ב – machine.config תופס את הקריאות של wcf services ב – BeginRequest (שזה השלב המוקדם ביותר) הוא מגדיר את המאפיין HttpContext.Current ל – null, ומכיוון שהמודול תפס את ה – request כל שאר התכונות (אילו שהזכרתי ועוד כמה) לא פעילים.

 

כדי לפתור את הבעייה ניתן להגדיר שהשירות יעבוד ב – Compatibility Mode (בהמשך נראה כיצד) במקרה כזה השירות עובד באותה צורה של Web Services, אבל מכיוון שזה עובר את כל ה – Life Cycle של ה – web אפשר להעביר רק בפרוטוקול http.

 

 

לאפשר לגשת מ – WCF Service ל – HttpContext.


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

 



<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />


 

 


ובנוסף צריך להגדיר במימוש השירות את הדבר הבא:

 



[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]


public class Calc : ICalc


 


צירוף שני הדברים ייתן את האופצייה לגשת ל – HttpContext.Current ויפתור את רוב הבעיות שציינתי מקודם.

 

 

לאפשר לגשת מ – WCF Service ל – Session.


כדי לאפשר לגשת למידע שיש ב – session הלקוח צריך לאפשר cookies (מכיוון שהזיהוי של ה – session מתבצע בעזרת cookie) ולכן צריך להגדיר ב binding (אצל הלקוח) שמותר להשתמש ב – cookie.

 



<system.serviceModel>


  <client>


    <endpoint name="calcEndpoint"


              address="http://localhost/IISHost/Service1.svc"


              binding="basicHttpBinding"


              contract="Contarcts.ICalc"/>


  </client>


  <bindings>


    <basicHttpBinding>


      <binding allowCookies="true">


      </binding>


    </basicHttpBinding>


  </bindings>


</system.serviceModel>


 


אין חשיבות להגדיר את זה אצל השרת רק אצל הלקוח שכמובן יכול להיות כל אפליקצייה (אפילו Console)

 

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

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

כתיבת תגובה

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

4 תגובות

  1. עידו פלטו9 בפברואר 2011 ב 21:32

    הי שלמה,
    רק דבר קטן – שים לב שקיימת בעיה עם aspnet compatibility כאשר מנסים לבצע מספר קריאות במקביל לשירות מאותו קליינט.

    יותר פירוט אפשר לקרוא בפוסט שכתבתי בנושא:
    http://blogs.microsoft.co.il/blogs/idof/archive/2010/09/27/asp-net-compatible-wcf-services-concurrency-problem.aspx

    הגב
  2. יוסי בראל15 במאי 2012 ב 13:07

    היי שלמה כתבתי DUPLEX SERVICE שמורץ ב IIS ואני משתמש בSERVICE ממחשב אחר

    שאלה: למה הוא לא חושף לי את ה ICALLBACK ואת האופציה לקבל בקונסטראקטור InstanceContext????

    הגב
  3. יוסי בראל15 במאי 2012 ב 13:07

    היי שלמה כתבתי DUPLEX SERVICE שמורץ ב IIS ואני משתמש בSERVICE ממחשב אחר

    שאלה: למה הוא לא חושף לי את ה ICALLBACK ואת האופציה לקבל בקונסטראקטור InstanceContext????

    הגב