This is a mirror of official site: http://jasper-net.blogspot.com/

Adding a Web reference dynamically at Runtime

| Tuesday, May 11, 2010
נניח את המקרה הבא:
אתם מפתחים אתר שיודע להציג סרטונים עבור חברות ואותם חברות מעוניינות להגדיר בצורה דינמית אלו פרסומות יוצגו לפני ואחרי הסרטון.

פתרון ראשון:
נשמור בבסיס הנתונים כתובת של 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;
   }
}


Read more: שלמה גולדברג

Posted via email from jasper22's posterous

0 comments: