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

9 בינואר 2011

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




ללמוד WCF 4 פרק 6 – אירוח השירות בפלטפורמות שונות.

 

 

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


אירוח שירות ב – Console Application, Windows Form Application, Windows Presentation Foundation.

אירוח שירות ב – Windows Service

אירוח שירות ב – Internet Information Services – IIS

אירוח שירות ב – Windows Process Activation Service – WAS

אירוח שירות ב – AppFabric

 

 

אירוח שירות ב – Console Application, Windows Form Application, Windows Presentation Foundation.



 

למעשה אירוח של שירות הוא בסך הכול Process כלשהו של מערכת ההפעלה שמארחת את השירות בתוכה, ולכן גם Console Application וגם WinForm וגם WPF הם למעשה אותו דבר, מכיון שמדובר באפיליקציה שאנחנו מריצים ובזמן שנפעיל אותה אנחנו נרים את השירות לאוויר, וראינו דוגמא לכך בפרק השני.

 

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

 



ServiceHost calcHost = new ServiceHost(typeof(Calc));


calcHost.Open();


 


Console.ReadLine();


 


השורה של Console.ReadLine חשובה רק במקרה של Console Application שיש לו נטייה להיסגר לאחר ביצוע השורה האחרונה של ה – Main ואם לא נעצור אותו ה – host לא יעבוד.

לעומת זאת ב – WinForm ו – WPF מספיק לפתוח את host והוא ישאר פתוח כל עוד שלא נסגור את החלון.

 

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

 



Calc calc = new Calc();


ServiceHost calcHost = new ServiceHost(calc);


 


נשתמש בצורה הזאת בדרך כלל כשהשירות צריך לקבל פרמטרים בבנאי שלו, ובמקרה הזה אי אפשר להעביר את ה – Type אלא צריך לייצר אובייקט ולתת לו את הפמרטרים המתאימים ולשלוח אותו ל – ServiceHpst. (במקרה הזה המוד שהשירות רץ בו צריך להיות Single – נדבר על זה באחד הפרקים הבאים)

 

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

 

 

 

אירוח שירות ב – Windows Service

 



 


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

 

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

 

ראשית, הוסיפו פרייקט מסוג Windows Service, יווצר קובץ בשם Service1 – נעבור לקובץ ה – cs שלו ונכתוב את הקוד הבא

 



namespace WindowsServiceHost


{


    public partial class Service1 : ServiceBase


    {


        private ServiceHost _calcHost;


 


        public Service1()


        {


            InitializeComponent();


        }


 


        protected override void OnStart(string[] args)


        {


            _calcHost = new ServiceHost(typeof(Calc));


            _calcHost.Open();


        }


 


        protected override void OnStop()


        {


            _calcHost.Close();


        }


    }


}


 


נוסיף קובץ קונפיג ונכתוב את ההגדרות המתאימות – בדוגמא אצלי כתבתי:

 



<system.serviceModel>


  <services>


    <service name="Service.Calc">


      <host>


        <baseAddresses>


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


        </baseAddresses>


      </host>


    </service>


  </services>


</system.serviceModel>


 


אפשר לראות שאני משתמש בתכונות של WCF 4 (מה שראינו בפרק הקודם) שאני מגדיר רק baseAddress והשאר מוגדר בצורה אוטומטית.

 

 

כעת מה שנשאר זה להתקין אותו ולהריץ אותו (כאן כתבתי פוסט כיצד מתקינים Windows Service) – חבל שאי אפשר פשוט ללחוץ על F5 אלא זה חייב לעבור תהליך התקנה (יש דרך להריץ אותו בזמן פיתוח כ – Console, עוד פרטים כאן).

 

אני אתאר בקצרה מה צריך לעשות כדי להתקין אותו:


לאחר כתיבת כל הקוד (והקונפיג) המתאים – חזרו לקובץ Service1 (ל – designer  – לא לקוד).

קליק ימין על השטח האפור ובחירה ב – Add Installer.

יווצר קובץ בשם ProjectIntaller1 ובו שני אלמנטים האחראים להתקין את השירות, תוכלו שם גם לבחור האם השירות יעלה בצורה אוטומטית ועוד הגדרות הקשורות ל – Windows Service.

כעת תפתחו Command Promt של הגרסה המתאימה (VS2008 / VS2010) ותריצו את הפקודה intallutil -i fileName (כש – fileName) מתחלף בנתיב המלא לקובץ ה – exe שלכם.

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

וכעת לקוחות יכולים לפנות לשירות מבלי שצריך לדאוג ל – host.

 

 

כמובן ששימוש ב – Windows Service הוא הרבה יותר טוב מאשר Console Application מכיוון שאנחנו לא צריכים לדאוג להפעלה ולכיבוי אלא זה מחובר למערכת ההפעלה, מצד שני עדיין יש מגוון נושאים שאנחנו צריכים לדאוג להם, החל מהתאוששות משגיאות (למשל השירות קרס משגיאה פתאומית – מישהו צריך להרים אותו בחזרה לאוויר) כיבוי אוטומטי של השירות אם אף אחד לא ניגש אליו כעבור זמן מסויים והחזרתו לאוויר בזמן שמישהו פונה לשרת.

 

 

אירוח שירות ב – Internet Information Services – IIS

 



 

אופציה נוספת שתעשה עבורנו הרבה יותר דברים היא לארח את השירות ב – IIS, נוכל לארח שירות WCF כמו שאנחנו מארחים שם אפלקציות web רגילות.

 

גרסאות 5.1 (XP) ו – 6.0 (Windows Server 2003) תומכים רק ב – endpoints מסוג http, גרסאות מתקדמות יותר תומכים גם באחרים בעזרת WAS (נדבר עליו בהמשך).

 

כדי לארח ב – IIS נוסיף קובץ מסוג svc (נקרא WCF Service) לפרוייקט מסוג wab application, הוא יוסיף איתו גם Interface (עבור Contract ומימוש כלשהו בקובץ ה – cs של השירות).

כמו שאנחנו כבר יודעים אפשר לכתוב את הכול (Contract, Service, Host) בפרוייקט אחד – וזה מה שקרה כשהוספנו קובץ מסוג svc לפרוייקט, היות שבדוגמא שלנו המימוש של ה – Contract וה – Service הם בפרוייקטים שונים (כמו שמומלץ לעשות) נמחק את הקבצים IService1.cs ו – Service1.svc.cs ונשאיר רק את הקובץ Service1.svc.

 

כשנפתח את הקובץ נגלה שכתוב שם:

 



<%@ ServiceHost


        Language="C#"


        Debug="true"


        Service="IISHost.Service1"


        CodeBehind="Service1.svc.cs"


%>


 


 


שני הפרמטרים הראושנים הם מובנים,

הפרמטר Service אמור להכיל את השם המלא של המחלקה שמממשת את השירות – ולכן נשנה את זה ל – Service.Calc,

הפרמטר האחרון רלוונטי רק במידה וקובץ המימוש נמצא בפרוייקט של ה – host – ולכן במקרה שלנו נמחק את הפרמטר.

בסופו של תהליך הוא יראה כך:

 



<%@ ServiceHost


        Language="C#"


        Debug="true"


        Service="Service.Calc"


%>


 


 


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

 



<system.serviceModel>


  <services>


    <service name="Service.Calc">


      <endpoint binding="basicHttpBinding"


                contract="Contarcts.ICalc">


      </endpoint>


    </service>


  </services>


</system.serviceModel>


 

 


חשוב לשים לב שה – endpoint לא קבל פרמטר עבור ה – address, מכיוון שמדובר באפליקציית web הכתובת היא למעשה הכתובת של קובץ ה – svc (כמו כתובת של דף אינטרנט).

 

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

 



<system.serviceModel>


  <client>


    <endpoint name="calcEndpoint"


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


              binding="basicHttpBinding"


              contract="Contarcts.ICalc"></endpoint>


  </client>


</system.serviceModel>


 


ובקוד כתוב:

 



static void Main(string[] args)


{


    ChannelFactory<ICalc> channel = new ChannelFactory<ICalc>("calcEndpoint");


    ICalc proxy = channel.CreateChannel();


 


    int res = proxy.Add(2, 4);


 


    channel.Close();


}


 

 


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

 

 

במידה ורוצים קצת יותר שליטה על יצירת השירות (למשל במידה ויש לו בנאי שמקבל פרמטרים) נוכל לעשות זאת בעזרת פרמטר שנקרא Factory, נכתוב בקובץ ה – svc את הקוד הבא:

 

<%@ ServiceHost


        Language="C#"


        Debug="true"


        Service="Service.Calc"


        Factory="IISHost.CalcFactory"


%>



 


 

נוסיף את המחלקה הבאה: (יש להוסיף reference ל – System.ServiceModel.Activation)

 



namespace IISHost


{


    public class CalcFactory : ServiceHostFactory


    {


        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)


        {



              // Cutsom Code   


        }


    }


}


 

 


כך נוכל לכתוב קוד ליצירת ה – host

 

 

אירוח שירות ב – Windows Process Activation Service – WAS


החיסרון המרכזי של IIS (בגרסאות הישנות) הוא שאפשר לעבוד רק עם פרוטוקול http מה שפחות יעיל כמובן, במידה וזה אפשרי לעבוד עם tcp (אפליקציה פנימית וכו') עדיף לעשות זאת – במידה ועדיין נרצה לארח אותה ב – IIS, נוכל רק במידה ויש לנו גרסה 7 ומעלה (ויסטה).

 

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

נפתח את ה – IIS.

נחפש את האפליקציה שלנו – קליק ימין ונבחר ב – Manage Application -> Adavanced Settings.

במאפיין Enabled Protocols נוסיף איזה פרוטוקול שנרצה.

 

WAS

 

 


כמובן שנצטרך לשנות בקונפיג את ההגדרות המתאימות:

בשרת:

 



<system.serviceModel>


  <services>


    <service name="Service.Calc">


      <endpoint binding="netTcpBinding"


                contract="Contarcts.ICalc">


      </endpoint>


    </service>


  </services>


</system.serviceModel>


 


בלקוח:

 



<system.serviceModel>


  <client>


    <endpoint name="calcEndpoint"


              address="net.tcp://localhost/IISHost/Service1.svc"


              binding="netTcpBinding"


              contract="Contarcts.ICalc"></endpoint>


  </client>


</system.serviceModel>


 


וכעת גם נקבל את כל הניהול של IIS וגם נקבל את התכונות של עבודה בפרוטוקול tcp.

 

 

 

אירוח שירות ב – AppFabric


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

 

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

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

כתיבת תגובה

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

תגובה אחת

  1. נאור24 באוגוסט 2011 ב 14:29

    כשיצרת SVG, הורדת את ה-Attribute של CodeBehind. כיצד יודע ה-SVG היכן המימוש של הסרביס?

    הגב