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

שאלה
-
יש לנו אפליציית 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)
בתודה מראש,
מורן
תשובות
-
הייתי מנסה קודם למצות את הנתיב של שימוש בתוכנה בתצורה הסטנדרטית. למשל, יכול להיות ש- 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
כל התגובות
-
הייתי מנסה קודם למצות את הנתיב של שימוש בתוכנה בתצורה הסטנדרטית. למשל, יכול להיות ש- 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
-
-
הייתי מנסה קודם למצות את הנתיב של שימוש בתוכנה בתצורה הסטנדרטית. למשל, יכול להיות ש- AtEasy קורסת כיוון שהיא מנסה לטעון את ה- assembly, מה שלא מתאפשר כי התהליך שלה רץ תחת CLR 2.0. במקרה כזה אפשר לנסות להשתמש ב- app.config כדי לשנות את גרסת ה- CLR שתריץ את התהליך של AtEasy, ואז ייתכן שהיא תצליח לטעון assemblies של .NET 4. זה כמובן כרוך בבדיקות ועבודה מסוימת, אבל כנראה יהיה זול יותר מלכתוב את ה- WCF Service שדיברת עליו.
תודה רבה סשה, זה באמת עזר!
הייתי צריך לכתוב את קובץ הקונפיגורציה הבא:
<configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"> </startup> </configuration>
שוב תודה,מורן