יצירת listener ב-C#

שיווקי

New member
יצירת listener ב-C#

שלום,
אני מעוניין לייצר listener (או service ודומייו - אם יש משהו טוב יותר) ב-C#.
אני משתמש בגירסה VS 2010.

על ה-listener להאזין לבקשות שמגיעות מעת לעת (יכול להיות בשרת web), ולפעול תמיד (לא script - עליו להיות תמיד בלולאה אינסופית של בקשות, כיוון שאני מבצע כמה פעולות ראשוניות וחד פעמיות של אתחול ה-listener שהן דיי כבדות, כמו התחברת ל-db, ועוד מספר פעולות חד פעמיות ולא חוזרות ונשנות לכל הרצה של בקשה, שזה יכול להיות משמעותי, אם אני מקבל 1000 קריאות שצריך להציג תוצאה כוללת בשניה).

אני מחפש דרך יעילה לכתוב זאת ב-C# עבור VS 2010, ואם יש פרוטוקולים שאני יכול להשתמש בהם על מנת לבקש בקשות מה-listener (שתמיד מאזין).

לא בטוח שזה משנה, אך יש לי שרת web (פנימי) שאני יכול להשתמש בו, וה-framework שאני מעדיף הוא 3.5 ל-32 ביט (גם 4 זה אפשרי, אך אני צריך מספר התאמות לכך).

אשמח להכוונה ולדוגמאות.

תודה.
 

שיווקי

New member
נראה כמו פרוטוקול שמתאים ל-web services

... במידה ו-WSDL, זה web service שעטוף ב-soap שעטוף בפרוטוקול xml, לכן, אני יותר אוהב להשתמש ב-rest,
אך אני מחפש windows service (כמו שיש ב-control panel + services של windows). לא web service.

אגב, עבדתי עם WCF דיי מזמן. לא נראה שמתאים, כיוון אני מחפש משהו שירוץ קבוע ויקבל בקשות - חייב להיות קבוע ולא בשימוש לפי צורך, גם כיוון שאני מבצע login לאפליקציה עם משתמש מסויים, ואין לי צורך כל פעם לבצע login שוב ושוב כמו ש-dll מתנהג בלית ברירה, ועוד מספר פעולות (השיטה של services היא לולאה אינסופית. אני לא יודע אם ה-VS 2010 יש לו משהו מובנה, שכבר אפשר להשתמש - כתבתי פעם משהו ב-C++ - דברים השתנו מאז...).

הארכיטקטורה זה service שמקבל בקשות בפרוטוקול מסויים.
רציתי דוגמה פשוטה של משהו שעובד (למשל client שמבקש בקשה לקבלת מחרוזת כתוצאה. ה-client מעביר פרמטר מחרוזת, ומקבל בחזרה מחרוזת + חותמת תאריך/זמן מהשרת בזמן אמת - לא אחרי delay אסינכרוני).
זה מה שהתכוונתי ל-listener (זה סוג של windows service).
גם באיזה פרוטוקול כדאי "לדבר" עם ה-listener?

תודה.
 

nocgod

New member
אתה כנראה לא זוכר מה עשית עם WCF

א. WCF יכול להיות לא קשור לסבון בכלל. אנחנו בעבודה בשירותים ישנים משתמשים בו עם restbehaviour
ב. כדי לעשות את מה שאתה רוצה אתה קודם צריך להבין מה אתה צריך
ג.. לגרסאת ה VS אין שום משמעות, יש משמעות רק לקומפיילר ולגרסאת הדוטנט
ד. כדי לעשות את זה אתה צריך להרים self hosting web api service
ה. listener זה design pattern. תצטרך להיות יותר מדוייק במה שאתה מבקש.


אני מה אני הבנתי אתה צריך webapi service שישב לך במחשב (IIS או selfhost או mono אם אתה נינג'ה)
הwebapi serivce שלך צריך לחשוף החוצה כמה endpoints שאפשר כמובן לדבר איתם בבאמצעות בקשות HTTP
אם תתכנן כמו שצריך את הסרויס שלך צריך להיות 3 חלקים:
ה Endpoint שמטפל בקבלת מידע וניהול שוגיים כלפי חוץ.
ה BL שיכיל כל לוגיקה שקשורה להחזרת המידע הנדרש, כולל טיפול שגויים פנימי, מוניטורינג ולוגיג
ה DL שיכיל כל מה שקשור לחיבור לDB שלך וכמובן פעולות CRUD על הישויות שלך.
כל אלה צריכים להיות decoupled, ועל כן צריך להיות לך פרוייקט שיכיל את הinterfaces ואת ה datacontracts. החלקים ביניהם יהיו מחוברים עם DI.

או תכתוב משהו פשוט בnode/ruby/go/python...
 

שיווקי

New member
או קיי.

לאחרונה הקמתי פרוייקט ב-vs 2010 מסוג mcv4 web api application (לשם כך צריך גם התקנה מיוחדת, כי עבור vs 2010 ה-mcv4 לא מובנה) ובניתי אתר web עם rest api שעובד (אתר פנימי) ואני מעדיף להשאר בטכנולוגיה הזאת.
אמנם זה נקרא api application, או whatever, אך זה dll בפועל ולא exe.
אותו dll - כל פעם שקוראים לו, כל הפרמטרים (ביחוד session) מתאפסים (כהתנהגות רגילה של dll, וכל dll לא יפתור את הבעיה - זה service שמורץ ע"י C:\Windows\system32\services.msc)

אני צריך להפעיל session אחד (שירוץ מבחינתי יומיים או פרק זמן גדול מספיק) ולא לפתוח כל פעם session שוב ושוב (זה הרבה time consuming).

אם יש צורך להגדיר בנוסף פרמטרים על ה-rest api שירוץ תמיד, כי הוא לא רץ תמיד (כל פעם שאני פונה אליו - המשתנים שלו מתאפסים), אז זה עדיף מבחינתי, במקום לנסות משהו נוסף, כמה זמן שייקח (לא ראיתי ולו דוגמה אחת) - מה יהיה אם בסוף אגיע לאותה נקודה? אם יש דוגמה כתובה כלשהי (הכי הכי פשוטה - לא ממש מצאתי באינטרנט ... סורי). אני אחפש endpoint ל-rest api (צריך לדעת מה לשאול - לא הכרתי את המושגים. תודה על ההארה, רק אני צריך לדעת אם יש אפשרות להשאיר את ה-rest api, או במידה ולא אפשרי - הפתרון של wcf שהצעת, קבוע בזיכרון).

תודה.
 

marvin2

New member
אתה עושה סלט

אין קשר בין הטכנולוגיה (פרוטוקל - SOAP,WEB API וכו') לבין צורת האירוח. האירוח יכול להיות תחת IIS, או SELFHOST (במידה ומדברים על WCF, שיכול גם להיות REST לחלוטין) לבין כל שיטה אחרת שתבחר. גם אז אתה יכול לתחזק משהוא כסרביס או כפרוסס (שזה בתכלס אותו הדבר, רק אינטרפייס קצת שונה, זה הכל)
&nbsp
תבחר במה שאתה הכי שולט. במידה וכל מה שאתה צריך זה WEB API פשוט וזריז - אולי תשחק עם NODE.JS. זה זריז, ה ASYNC I./O מוטמע שם מאפס ככה שזה יפשט לך את מרבית התהליכים.
&nbsp
&nbsp
 

nocgod

New member
גם webapi יכול להיות selfhost

יותר מזה, אם הוא יתקדם ל.net 4.5 אולי אפילו יותר לעשות owin.

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

שיווקי

New member
כמה הבהרות.

כבר בניתי web api ואם יש אפשרות לייצר service (לא web service, ול-rest יש כמה שיטות) בדרך הזאת, אז זה עדיף מבחינתי, כי זה קוד כבר כתוב ועובד, אך מה שלא עובד זה שכל קריאה ל-web api (וזוהי הבעיה היחידה והעיקרית, והשאלה פה היא לא איך לייצר web api), אני צריך לבצע אתחולים שונים, בעיקר ביצוע logon לאפליקציה אחרת שאני מפעיל (ועל כן, רצוי שזה יהיה פעם אחת בלבד. מן הסתם, זה משאבים מיותרים), לכן אני מחפש ארכיטקטורה.

אני משתמש ב-VS 2010 (ואין לי הרבה ברירות, וזוהי הפלטפורמה שאני משתמש), וכיוון שאין התקנה default-ית ל-MCV4, אני הורדתי התקנה מ:
http://www.microsoft.com/en-ca/download/details.aspx?id=30683

הסבר על MCV4 נמצא ב: http://www.microsoft.com/en-ca/download/details.aspx?id=30683

בקצרה:
לאחר התקנת התוסף של MCV4 עבור VS 2010, אני יוצר פרוייקט מסוג WEB -> ASP.NET MCV 4 WEB APPLICATION.
בוחר web api (אני חייב פרוטוקול חיצוני לשם כך).

*עבור הפרוייקט שייצרתי אני יוצר controller, (ב-solution explorer יש מחיצה של controllers, קליק ימיני בעכבר + add + controler ואח"כ בוחר api controller), וכותב לו get, post (ויש עוד כמה).
* ב-webapi.config מוסיף את ה-formatters הרלוונטיים שאני מעוניין בהם בנוסף (למשל json), ומשנה את אופי ה-string שאני שם ב-http.
* השימוש הוא בקריאה פשוטה למשל : Http://myserver/myapi?param1=value (כמו לקרוא לאתר). אגב, לגוגל יש rest web api client tools לבדיקת תקינות הנ"ל.

זה הכל.
ב-controller שכתבתי, אני פונה ל-dll, מבצע logon, ומבצע כל מיני אתחולים, שאמורים להיות חד פעמיים.
מה הבעיה?! כשאני קורא מבחוץ, אני קורא כל הזמן לכתובת (כמו אתר אינטרנט רגיל), ואז כל פעם אני צריך לבצע logon מחדש שוב ושוב.
מה גם, שהאובייקט של ה-controller כל פעם מאותחל מחדש, וצריך לדאוג ל-logoff, אחרת המחשב יתפוצץ ב-session-ים פתוחים.

פיתרון שחשבתי עליו - להישאר בטכנולוגיה הקיימת, אך במקום שה-web api controller יבצע את ה-logon, יהיה service שרץ תמיד ברקע, שיהיה עם session פתוח (או גם אחת לשעה - זה גם בסדר), ואני אשתמש בו לכל הפעולות שאני צריך לבצע (כלומר ה-web api controller יקרא ל-service שיבצע עבורי את הפעולות).
ייתכן שזה לא הפיתרון המושלם ביותר, אך כרגע הוא נראה לי המעשי ביותר.
פתרון אחר, זה סוג אחר שלאחר בחירה של WEB -> ASP.NET MCV 4 WEB APPLICATION, כמו internet application במקום web api, אך אני לא יודע אם זה ממש עוזר, וזה דיי ניסוי ותעיה.
כלומר ארכיטקטורה עדיפה היא: rest api controller שקורא ל-service, שמבצע עבורי את הפעולות המתבקשות (service - הכוונה לתוכנית קבועה שרצה ברקע, בדיוק כמו windows service, כפי שהצגתי, ולא web service).

מה ה-service (לא web service, כיוון שאנו חוזרים לאותה נקודה) צריך?
אני מנסה לרדת לסוף דעתך:
האם ה-service, כפי שאמרת, זה לולאה אינסופית, שכל בקשה מתבצעת ע"י endpoint (אני צריך, תשובה מיידית. אם נציג משהו פשוט: נניח וה-client משדר מחרוזת, והשרת מחזיר כתשובה : <your string is: <your string).

הארכיטקטורה שיהיה משתמש אחד מרכזי שמפעיל את ה-service (והוא יקבל את הבקשות השונות - זה משתמש proxy, שמרכז את כל הבקשות) - מספיק logon ראשוני בעת הבקשה הראשונה שהתקבלה.

זה הכל.
אני בסך הכל צריך דוגמה - איך לייצר service כזה שממתין לבקשות ומחזיר תשובה (עם waiting - בתכלס הנעילות יהיו קצרות ככל האפשר).
דוגמה הכי הכי פשוטה: למשל client ששולח מחרוזת כלשהי ומקבל בחזרה תשובה מהשרת:
Your string is: <your string>
ה-web api גם יכול לתפקד כ-client לכל דבר (שצד השרת הוא ה-listner שמבצע כמה אתחולים ראשוניים ומקבל בקשות שונות).

עדיף שאני אשדר מחרוזת בדומה לפרוטוקול http.

אשמח לדוגמה.

תודה.
 

שיווקי

New member
אני אמשיך להשתמש בטכנולוגיה של מייקרוסופט לפיתרון.

אני לא יכול אחרת. זוהי תשתית של לקוח, ולא ניתן לשנות הרבה.

יש דוגמה ליצירת service:
https://www.youtube.com/watch?v=uM9o8GsO_u4

כל מה שחסר זה להפעיל בקשה ל-service (לקרוא לו מבחוץ) ולהפעיל פקודה כלשהי (כמו listener).
למשל: client שמשדר ל-service מחרוזת ומקבל בחזרה מיידית תשובה (סינכרונית):
Your string is: <your string>
זה למעשה web service שקורא ל-service, אך ברגע שאדע את הנ"ל - העניין כבר יהיה פתור.

תודה.
 

marvin2

New member
זה לא WEBSERVIC שקורא לסרביס..

זה וואב סרביס שחי בתוך סרביס.
 

שיווקי

New member
למה דווקא wcf יפתור את העניין. מה ש-rest api לא.

REST API חי באתר web שמקבל בקשות.
כנ"ל WCF.

אני יכול לנסות להשתמש ב-WCF במקום ב-REST API, אך לא מבין למה זה יעזור בדיוק ב-scope של המשתנים והזמן חיים של ה-session של ה-WEB SERVICE שמופעל.

אני צריך שה-WCF יאתחל משתנים ראשוניים, שייחיו כל עוד ה-service שמפעיל אותו חי (או ה-REST API). ה-service שאתה טוען שה-web service חי בו.

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

תודה.
 

amosexy

New member
אתה בטוח שאתה מבין את המודל של סרביסים?

מה שאני מניח שאתה רוצה לעשות זה סרביס של INIT שיחזיר לך SESSION ID
והשרת שלך שרץ ( בלי קשר לסרביסים שאתה פונה אליהם מדי פעם ) יחזיק מפה עם האובייקטים וה SESSION ID כמפתח
&nbsp
וכך בתשתית שלך כל קריאה לסרביס נוסף תקרא את ה SESSION ID הזה , תוציא את האובייקט לעבודה.. ומכאן תמשיך לעבוד רגיל..
&nbsp
&nbsp
 

marvin2

New member
כשאתה אומר חי באתר WEB למה אתה מתכוון?

נכון, אפשר לארח שרות WCF תחת IIS אבל אפשר לארח אותו בקוד, ואז הסרביס שלך הוא זה שיארח את ה WCF. זה נקרא SELF HOST. יש מליון דוגמאות לזה, הנה אחת רנדומלית:
http://blogs.msdn.com/b/alikl/archi...host-and-test-simple-restful-wcf-service.aspx
&nbsp
קח את זה, זרוק את זה בתוך סולוטישן של SERVICE והרי לך SERVICE שעונה לבקשות WEB. בלי IIS ובלי "שרת WEB" .
&nbsp
&nbsp
 
למעלה