Adding a Web reference dynamically at Runtime

10 במאי 2010

4 תגובות


 



כיצד ניתן לקבל מידע מרחוק בצורה דינמית – (כלומר בלי לעשות 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);


 

 

 

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

4 תגובות

  1. shayamar10 במאי 2010 ב 16:29

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

    הגב
  2. רועי1 בספטמבר 2010 ב 16:27

    שלום לך! רציתי לדעת האם אני מבין. לדוגמא אני הולך לויזואל סטודאו ויוצר 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"? ואיך הוא נהיה כחלחל אם הקליינט לא מכיר אותו (אם עשיתי סלט מחוסר הבנה תסלח לי. למדנו את הנושא בחטף במכללה ולא טרחו להראות לנו פרקטיקה מעבר לשרת מקומי).

    הגב
  3. Shlomo1 בספטמבר 2010 ב 18:37

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

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

    הגב