העברת מידע - Class

בטיטi

New member
../images/Emo41.gif העברת מידע - Class

יש לי Class המכיל 5 שדות, שמשותף לקליינט ולסרבר. הקליינט יוצר אינסטנס של ה Class, מאתחל 5 שדות, ושולח את הקלאס ל WebService, ה WebService מכניס ערכים ל 5 שדות הנותרים. האם בקליינט, לאחר שה WebService סיים עבודתו, אראה את ה 5 ערכים החדשים ? אם לא, כיצד גורמים לזה לקרוא ?
 

ShlomoBenAri

New member
אם ה WS נמצא בשרת מרוחק, את איזה...

את איזה ref הוא יראה ב ref, נדמה לי מקבל הקריאה מעדכן בכתובת שהוא קיבל איך תתכן גישה מה WS לכתובת אצל הלקוח. אשמח לדעת.
 

עידו פ

New member
הכל מתבסס על איך ה-WSDL נבנה

כשאתה בונה WS שמקבל אובייקט ב-ref, ב-WSDL מתווסף למתודה ערך מוחזר עבור הטיפוס שהועבר ב-ref. כשאתה מבצע add web reference, הקוד שרץ מספיק "חכם" בשביל לזהות את המקרה וליצור proxy שבעצמו מקבל ref ובקוד שנוצר הוא קורא ל-WS, מקבל את הערך שחוזר, ושם אותו באובייקט שהועבר ב-ref. הכי פשוט לנסות ולראות בעיניים, במקום רק להעלות השערות !
 

rnan

New member
מה ?????????

CLASS הוא REF TYPE מלכתחילה שליחת REF היא מיותרת
 

בטיטi

New member
בדיוק מה שכתבתי, אבל...

עם REF ובלי REF, ה CLASS לא מועתק, אלא עובר מצביע, אבל אין משמעות למצביע לאיזור בזכרון במחשב A,עבור זכרון במחשב B... (אלא אם מחשיבים פוטנציאל הרסני למשמעות...
)
 

rnan

New member
אתה תיהיה חייב ל

לשלוח ל WS ולקבל את האובייקט בחזרה אחרי סריאליזציה כמובן. אישית הייתי מציע לשלוח ( אם זה 10 שדות) איזה DATASET קטן וחמוד ( | | | | | | ) חחחח במקום לעשות זאת בעצמך.....
 

בטיטi

New member
כלומר...

"לשלוח ל WS ולקבל את האובייקט בחזרה" במקום שה WebMethod יעדכן את הפרמטר שהוא קיבל, הוא גם יחזיר את הפרמטר (במקום void). כלומר, לאחר שהוא מעדכן אותו, פשוט לבצע לו return מהמתודה ?
 

עידו פ

New member
אין משמעות ל-ref type כשעובדים מול

מכונה אחרת - בין כה במקרה הזה מבוצע serialize לאוביקט. פשוט צריך לסמוך על הדוט נט שהוא יודע לזהות את מקרים האלו ולג'נטרט להם קוד מתאים. הכי פשוט לכתוב WS קליל שעושה את זה ולהסתכל על ה-WSDL שנוצר ועל הקוד המג'ונטרט שנוצר ב-add web reference.
 

בטיטi

New member
../images/Emo41.gif חשבתי על זה, אבל זה מוזר.

Class הוא Reference Type, לכן בכל מקרה מה שעובר זה הכתובת שלו, לא ? וגם אם אעביר עם ref, ומה שיעבור זה מצביע ל Class, כיצד זה יתכן ? הרי ה WS יכול להיות מותקן על שרת אחר, ובעצם יש לו מרחב זכרון אחר, הוא יקבל כתובת, שבכלל מתייחסת לזכרון אחר...
 

עידו פ

New member
במקום לשאול, למה שלא תנסה ?!

אחרי שתראה שזה עובד, תתחיל לחקור את הקוד שנוצר "מאחורי הקלעים" ותבין לבד שדוטנט פשוט עשה עבורך את העבודה הקשה. ודרך אגב, עדיף לעבוד עם return value ולא עם ref-ים, לך תדע איך פלטפורמות אחרות שאינן דוטנט "יאכלו" את ה-WSDL שנוצר.
 

בטיטi

New member
אתה צודק, אני פשוט כבר לא

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

עידו פ

New member
למה MSIL ?

תיצור WS שמקבל REF ותיצור אפליקציה ותבצע שם add web reference. תסתכל על ה-WSDL של ה-WS ותראה איך נראה ה-response של המתודה. תסתכל באפליקציה על ה-references.cs שג'ונטרט עבור ה-WS ותראה איך הוגדרה שם מתודת הפרוקסי - הקוד שם הוא פשוט מאוד ופשוט מבצע השמה של ה-return value המתאים מה-WS לתוך המשתנה שהועבר כ-ref למתודת הפרוקסי
 

בטיטi

New member
תגובה :

1. אני מסתכל על ה WSDL, בהתחלה יש את החלק של ה wsdl:types המגדיר את מבנה הנתונים, לאחר מכן יש את כניסות ה wsdl:message עבור המתודות,עם סיומת SoapIn ו SoapOut עבור כל מתודה. אני רואה שה SoapOut של המתודה, מכילה אלמנט זהה לפרמטר הנשלח. האם זו כוונתך ? שהוא בעצם מחזיר את אותו אובייקט ? (אני מסתכל בכלל במקום הנכון ?
) 2. לגבי ה reference.cs :
public void MyMethod(ref MyParamType MyParam{ object[] results = this.Invoke("MyMethod", new object[] { MyParam MyParam = ((MyParamType)(results[0])); }​
האם אתה מתכוון לשורת האחרונה, שבה מציבים את ערך ההחזר, לתוך הפרמטר ?
 

בטיטi

New member
../images/Emo51.gif ושאלה אחרונה בנושא :

כשאני מעביר STRUCT, ברור לי שצריך לכתוב REF, מכיוון שהוא VALUE TYPE, אבל כשמעבירים אובייקט, בכל מקרה עובר מצביע, ולא האובייקט עצמו, אז מה המשמעות של REF ל CLASS ? אולי זה רלוונטי רק במקרה שהצגתי, מעבר האובייקט בין מכונות, רק כדי לסמן לדוט נט שחשוב לשמור על הערכים ? (כלומר, בכל מקרה שאין תקשורת והעברת נתונים בין מכונות, REF ל CLASS מיותר.. ?)
 
למעלה