none
מהי הדרך המומלצת לארח WCF service תחת ההנחות הבאות RRS feed

  • שאלה

  • יש לנו אפליציית desktop המפותחת ב- VS2008 עם dot net 2. לאפליקציה יש מחלקת API המאפשרת להפעיל פונקציות שלה ללא GUI.

    אחד הקליינטים של ה-API היא תוכנת AtEasy - זוהי תוכנה לייצור סט של בדיקות אוטומטיות. לא כ"כ חשוב מה היא עושה - מה שכן חשוב הוא שהיא יודעת להתממשק ל-assemblies של dot net אך לא לגרסה 4 (אם מנסים לטעון dll שנכתב ב-4, התוכנה קורסת).

    כעת אנחנו רוצים לשדרג את האפליקציה ל-vs2010 ו-dot net 4, אל עדיין לאפשר ל-AtEasy להתממשק אליה. שדרוג גרסת ateasy לגרסה מתקדמת התומכת ב-dot net 4 אינו אפשרי מסיבות ארגוניות.

    חשבנו להשאיר את ה-assembly של ה-api בגרסת 3.5 אבל אז לא ניתן לקרוא ממנו ל-assembly מגרסה גבוהה יותר (4).

    הפתרון שהחלטנו עליו הוא להרים WCF Service עם ה-API תחת dot net 4 וה-client שלו יהיה מגרסה 3.5 ו-AtEasy יתממשק אליו.

    ועכשיו השאלה: מהי הצורה הנכונה ביותר

    א. לארח Service שאמור לשרת קליינט בודד באותו מחשב

    ב. ה-Service צריך לרוץ רק בזמן שה-client צריך אותו.

    ג. על קוד ה-client ליזום את הרמת השרת (למשל ע"י יצירת process חדש עם ה-service) אך לפני כן לוודא שהוא לא כבר רץ.

    ד. לוודא עד כמה שאפשר שה-service נסגר אחרי שה-client סיים לעבוד מולו (למשל בזמן dispose של ה-client או אחרי timeout)

     

    בתודה מראש,

    מורן

    יום ראשון 03 אפריל 2011 18:43

תשובות

  • הייתי מנסה קודם למצות את הנתיב של שימוש בתוכנה בתצורה הסטנדרטית. למשל, יכול להיות ש- AtEasy קורסת כיוון שהיא מנסה לטעון את ה- assembly, מה שלא מתאפשר כי התהליך שלה רץ תחת CLR 2.0. במקרה כזה אפשר לנסות להשתמש ב- app.config כדי לשנות את גרסת ה- CLR שתריץ את התהליך של AtEasy, ואז ייתכן שהיא תצליח לטעון assemblies של .NET 4. זה כמובן כרוך בבדיקות ועבודה מסוימת, אבל כנראה יהיה זול יותר מלכתוב את ה- WCF Service שדיברת עליו.

    אם כבר מחליטים לכתוב את ה- service, אז אפשר להשתמש ב- named pipe binding (רצוי, משיקולי אבטחה, שכן דרושה רק תקשורת מקומית) או TCP binding, וה- client יכול להפעיל תהליך שיקבל (למשל ב- command line) את הפרמטרים ההכרחיים כדי לדעת להרים את ה- service באופן שה- client יידע לדבר איתו. כדי לדעת שהתהליך כבר לא רץ אפשר להשתמש ב- mutex למשל, אריק כתב מאמר יפה על single instance applications (ר' לינק מטה). לבסוף, כדי לוודא שה- service נסגר יהיה צריך טיפול מיוחד ב- client - אני לא מכיר אפשרות לעשות את זה אוטומטית מה- dispose של ה- proxy של WCF, אלא צריך יהיה לכתוב קוד מפורש ששולח הודעה מיוחדת ל- service שמלמד אותו לרדת, או שולח הודעה לתהליך עצמו שגורמת ל- Host לרדת.

    single instance application: http://blogs.microsoft.co.il/blogs/arik/archive/2010/05/28/wpf-single-instance-application.aspx


    Sasha Goldshtein | http://blogs.microsoft.co.il/blogs/sasha
    • סומן כתשובה על-ידי moranlf יום ראשון 10 אפריל 2011 20:47
    יום שני 04 אפריל 2011 05:50

כל התגובות

  • הייתי מנסה קודם למצות את הנתיב של שימוש בתוכנה בתצורה הסטנדרטית. למשל, יכול להיות ש- AtEasy קורסת כיוון שהיא מנסה לטעון את ה- assembly, מה שלא מתאפשר כי התהליך שלה רץ תחת CLR 2.0. במקרה כזה אפשר לנסות להשתמש ב- app.config כדי לשנות את גרסת ה- CLR שתריץ את התהליך של AtEasy, ואז ייתכן שהיא תצליח לטעון assemblies של .NET 4. זה כמובן כרוך בבדיקות ועבודה מסוימת, אבל כנראה יהיה זול יותר מלכתוב את ה- WCF Service שדיברת עליו.

    אם כבר מחליטים לכתוב את ה- service, אז אפשר להשתמש ב- named pipe binding (רצוי, משיקולי אבטחה, שכן דרושה רק תקשורת מקומית) או TCP binding, וה- client יכול להפעיל תהליך שיקבל (למשל ב- command line) את הפרמטרים ההכרחיים כדי לדעת להרים את ה- service באופן שה- client יידע לדבר איתו. כדי לדעת שהתהליך כבר לא רץ אפשר להשתמש ב- mutex למשל, אריק כתב מאמר יפה על single instance applications (ר' לינק מטה). לבסוף, כדי לוודא שה- service נסגר יהיה צריך טיפול מיוחד ב- client - אני לא מכיר אפשרות לעשות את זה אוטומטית מה- dispose של ה- proxy של WCF, אלא צריך יהיה לכתוב קוד מפורש ששולח הודעה מיוחדת ל- service שמלמד אותו לרדת, או שולח הודעה לתהליך עצמו שגורמת ל- Host לרדת.

    single instance application: http://blogs.microsoft.co.il/blogs/arik/archive/2010/05/28/wpf-single-instance-application.aspx


    Sasha Goldshtein | http://blogs.microsoft.co.il/blogs/sasha
    • סומן כתשובה על-ידי moranlf יום ראשון 10 אפריל 2011 20:47
    יום שני 04 אפריל 2011 05:50
  • תודה רבה על התשובה סשה!

    אנסה את ההצעה הראשנוה ואדווח

    שוב תודה,
    מורן 

    יום שני 04 אפריל 2011 06:41
  • הייתי מנסה קודם למצות את הנתיב של שימוש בתוכנה בתצורה הסטנדרטית. למשל, יכול להיות ש- AtEasy קורסת כיוון שהיא מנסה לטעון את ה- assembly, מה שלא מתאפשר כי התהליך שלה רץ תחת CLR 2.0. במקרה כזה אפשר לנסות להשתמש ב- app.config כדי לשנות את גרסת ה- CLR שתריץ את התהליך של AtEasy, ואז ייתכן שהיא תצליח לטעון assemblies של .NET 4. זה כמובן כרוך בבדיקות ועבודה מסוימת, אבל כנראה יהיה זול יותר מלכתוב את ה- WCF Service שדיברת עליו.

    תודה רבה סשה, זה באמת עזר!

     

    הייתי צריך לכתוב את קובץ הקונפיגורציה הבא:

    <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0">
    </startup>
    </configuration>
    
    שוב תודה,
    מורן

    יום ראשון 10 אפריל 2011 20:47