DCSIMG
Adding a Web reference dynamically at Runtime - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

Adding a Web reference dynamically at Runtime

 

כיצד ניתן לקבל מידע מרחוק בצורה דינמית - (כלומר בלי לעשות Add Web Reference בזמן הפיתוח.)

 
(אפשר להוריד את דוגמת הקוד מכאן)
 
נניח את המקרה הבא:
אתם מפתחים אתר שיודע להציג סרטונים עבור חברות ואותם חברות מעוניינות להגדיר בצורה דינמית אלו פרסומות יוצגו לפני ואחרי הסרטון.
 
פתרון ראשון:
נשמור בבסיס הנתונים כתובת של Web Service שתחזיר רשימה של מחרוזות (עם שמות הפרסומות)
 
בעייה:
איך נפנה ל - Web Service בלי שאנחנו מכירים אותו מראש בזמן הפיתוח ?
הרי בדרך כלל אנחנו מוסיפים Reference ומקבלים proxy שאנחנו עובדים איתו, מה נעשה במקרה שאנחנו לא יודעים מה הכתובת.
 
 
שני פתרונות.
אחד מה שמוצע כאן שזה יצירה של ה - Proxy בצורה דינמית בעזרת CodeDom והקוד יראה בערך כך:
 
 
צד השרת (Web Service)
 

public class Service1 : System.Web.Services.WebService

{

    [WebMethod]

    public AdvertisementWS HelloWorld()

    {

        return new AdvertisementWS();

    }

}

 

public class AdvertisementWS

{

    public List<string> Before { get; set; }

    public List<string> After { get; set; }

 

    public AdvertisementWS()

    {

        Before = new List<string>() { "abf" };

        After = new List<string>() { "123" };

    }

}

 

 

צד הלקוח: כלומר (אנחנו)

 

object ret = WsProxy.CallWebService("http://localhost:60905/Service1.asmx",

                                    "Service1",

                                    "HelloWorld",

                                    null);

 

Advertisement advertisement = Advertisement.ConvertFromObject(ret);

 
בהתחלה נפנה למתודה שמקבלת:
  • כתובת של Web Service
  • שם המחלקה
  • שם המתודה
  • ופרמטרים (מערך של אובייקטים) למתודה
 
נקבל בחזרה אובייקט ונמיר את למחלקה שלנו בעזרת מתודה מיוחדת שנכתוב
 
 

public class Advertisement

{

    public string[] Before { get;set; }

    public string[] After { get; set; }

 

    public static Advertisement ConvertFromObject(object obj)

    {

        Advertisement res = new Advertisement();

        Type type = obj.GetType();

        res.Before = (string[])type.GetProperty("Before").GetValue(obj, null);

        res.After = (string[])type.GetProperty("After").GetValue(obj, null);

 

        return res;

    }

}

 
כמו שאפשר להבין צריך כמובן שהמתודה של ה - WebService תחזיר אוביקט שיש לו שני מאפיינים אחד בשם After והשני בשם Before.
 
(את הקוד המלא של המתודה CallWebService אפשר לראות בלינק הקודם או (ועדיף) שתורידו את דוגמת הקוד)
 
 
אופצייה שנייה.
נראית לי הרבה יותר טובה. היא לייצר handler שיחזיר מחרוזת בפורמט JSON ופשוט להמיר אותו בצד שלנו.
 
צד השרת (handler)
 

public class Handler1 : IHttpHandler

{

    public void ProcessRequest(HttpContext context)

    {

        context.Response.ContentType = "text/plain";

 

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        context.Response.Write(serializer.Serialize(new AdvertisementHandler()));

 

    }

}

 

public class AdvertisementHandler

{

    public List<string> Before { get; set; }

    public List<string> After { get; set; }

 

    public AdvertisementHandler()

    {

        Before = new List<string>() { "abf" };

        After = new List<string>() { "123" };

    }

}

 
 
צד הלקוח:
 

JavaScriptSerializer serializer = new JavaScriptSerializer();

WebClient client = new WebClient();

string str = client.DownloadString("http://localhost:60905/Handler1.ashx");

 

Advertisement abc = serializer.Deserialize<Advertisement>(str);

 
 
 

תוכן התגובה

shayamar כתב/ה:

יפה מאוד , האם יש לך כתובת של אחסון חינם לניסיונות של WS

# May 10, 2010 4:29 PM

Shlomo כתב/ה:

לא

# May 10, 2010 4:36 PM

שלמה גולדברג (הרב דוטנט) כתב/ה:

כיצד ניתן להפעיל מתודות של WebService שה - Proxy שלו נוצר בזמן ריצה. בפוסט הקודם הראיתי שני דרכים לעבוד

# May 13, 2010 8:28 AM

רועי כתב/ה:

שלום לך! רציתי לדעת האם אני מבין. לדוגמא אני הולך לויזואל סטודאו ויוצר  web service  שמחזיר לי hello world הלכתי לאתר שלי ואיכסנתי אותו בתקייה מסויימת (מה שבאמת עשיתי) כשניסיתי להתחבר דרך ה web refrence הוא כתב לי שאין לי הרשאות לקבל wsdl שזה: " 403 - Forbidden: Access is denied.

You do not have permission to view this directory or page using the credentials that you supplied.      "

אז א' איך אני מביא לו הרשאות???

ושנית אם הבנתי נכון במאמר שלך אתה מראה תקשורת ללא wsdl

אז כשכתבת:  object ret = WsProxy מה זה ה "WsProxy"? ואיך הוא נהיה כחלחל אם הקליינט לא מכיר אותו (אם עשיתי סלט מחוסר הבנה תסלח לי. למדנו את הנושא בחטף במכללה ולא טרחו להראות לנו פרקטיקה מעבר לשרת מקומי).

# September 1, 2010 4:27 PM

Shlomo כתב/ה:

הסיבה שלא יכולת להוסיף ref היא בנראה בגלל שלא יצרת virtual directory (זה לא מספיק רק להעתי לשרת).

אי אפשר לעשות תקשורת בלי WSDL - אני רק מראה איך אפשר לקבל את ה - WSDL בזמן ריצה מבלי לעשות add web ref בזמן פיתוח

# September 1, 2010 6:37 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 6 and 1 and type the answer here:


Enter the numbers above: