DCSIMG
הפעלה של מתודה מ - Web Service שנמצאת בדומיין אחר מתוך JavaScript - שלמה גולדברג (הרב דוטנט)

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

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

הפעלה של מתודה מ - Web Service שנמצאת בדומיין אחר מתוך JavaScript

 

כתבתי כמה פוסטים על הפעלה של WebService מתוך JavScript ומקבלים תוצאות ב - JSON.
 
זה עובד מעולה בתוך אותו דומיין.
 
כלומר אם אני גולש ל - http://www.MyDomain.co.il/App/MyPage.aspx ובתוך הדף יש JavaScript שמנסה לגשת ל - WebService בכתובת http://www.MyDomain.co.il/Services/Person.asmx הכל יעבוד כמו שצריך.
 
אבל אם ה - JavaScript ינסה להגיע ל - Service בדומיין אחר http://www.OtherDomain.co.il/Services/Person.asmx אחת דינו של הקריאה להכשל ולהציג הודעת שגיאה (או אזהרה) של חוסר הרשאות
 
 
Microsoft JScript runtime error: Permission denied
 
 
חבר לעבודה (ערן גרוס, CTO you-niversity ארה"ב) הציע רעיון נהדר כדי לעקוף את הבעייה.
 
במקום לפנות מהסקריפט ל - WebService כדי לקבל את ה - JSON, ניתן לכתוב Handler שיחזיר JSON ולייבא אותו כקובץ JavaScript.
 
לדוגמא נכתוב את ה - Handler הבא: (הדוגמא להפעלה עם WebService מוסברת בפוסט הזה)
 
 
 

public class Student

{

    public string Name { get; set; }

    public string Address { get; set; }

    public string Phone { get; set; }

    public int Age { get; set; }

}

 

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class Data : IHttpHandler

{

 

    public void ProcessRequest(HttpContext context)

    {

        context.Response.ContentType = "application/x-javascript";

 

        var students = new Student[]

        {

            new Student(){ Name = "Shlomo",

                            Age = 24,

                            Phone = "123456",

                            Address = "Elad"},

            new Student(){ Name = "Yossi",

                            Age = 23,

                            Phone = "543256",

                            Address = "Beni brak"},

            new Student(){ Name = "Tomer",

                            Age = 30,

                            Phone = "0000000",

                            Address = "Tel Aviv"}

        };

 

 

        DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(Student[]));

        MemoryStream stream = new MemoryStream();

 

        json.WriteObject(stream, students);

        stream.Seek(0, SeekOrigin.Begin);

 

        StreamReader reader = new StreamReader(stream);

 

        context.Response.Write(string.Format("var data = {0}", reader.ReadToEnd()));

    }

 

    public bool IsReusable

    {

        get

        {

            return false;

        }

    }

}

 
מוגדרת מחלקה בשם Student שאנחנו רוצים להחזיר מערך שלה.
 
המתודה ProcessRequest מגדירה שמה שחוזר ללקוח הוא מסוג application/x-javascript.
 
לאחר מכן היא מייצרת מערך של Student.
 
וכעת צריך לייצר אובייקט JSON מהמערך.
 
צריך להוסיף את ה - referencr הבאים:
System.Runtime.Serialization
System.ServiceModel.Web
 
הקוד שלאחר מכן כותב לתוך ה - stream את המידע ולאחר מכן מגדיר משתנה בשם data שמכיל את כל המידע.
 
 
כעת ב - html שלנו נכתוב כך:
 

<script type="text/javascript" src="Data.ashx"></script>

 
ובכל מקום בדף יהיה לנו משתנה גלובלי בשם data שמכיל את אותם Students.
 
כך נראה המשתנה data ב - watch (ב - Javascrip)
 
watch
 
 
 

תוכן התגובה

Pini Dayan כתב/ה:

או בקיצור ליצור proxy שלא מחייב אותך להזריק את המידע הזה לדף כל פעם גם שאתה לא צריך אותו.

אתה יכול לייצר את ה proxy גם בשרת וגם בצד הלקוח

או אפילו פתרון קצת מעצבן זה לעבוד עם רכיב flash שיפנה בשבילך לדף ....

או אפילו.... להשתמש document.domain..... למרות שהוא עושה בעיות אחרות)

# March 7, 2010 10:22 AM

תקוה כתב/ה:

מעולה. בדיוק מה שאני צריכה עכשיו.

# June 15, 2010 3:04 PM

עופר כתב/ה:

אתה יצרת אובייקט שמכיל 3 אובייקטים, האם אפשר לקבל לדו' המון נתונים מהDB ולולאה תוסיף כל פעם אובייקט חדש?

השתמשתי בדוגמא שלך באופן כזה:

Object FillBooks = null;

....

while (dr.Read())

               {

                   FillBooks = new bookClass[]

                      {

                        new bookClass(){

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

# January 4, 2012 8:18 AM

Shlomo כתב/ה:

בגלל שבלולאה הקוד כל פעם מייצר את המערך מחדש.

יש להשתמש ב - List ולהשתמש במתודת ADD

# January 4, 2012 8:37 AM

תודה רבה, לטובת קוראיך - אני מצרף את הקוד כתב/ה:

public List<object> ListBookName()

   {

       System.Collections.Generic.List<object> FillBooks = new List<object>();

       try

       {

           cmd.CommandText = "SELECT * FROM BooksTable";

           con.Open();

           dr = cmd.ExecuteReader();

           if (dr.HasRows)

           {

               while (dr.Read())

               {

                   FillBooks.Add(new bookClass()

                   {

                      IDBook = int.Parse(dr[0].ToString()),

                      BookName = dr[1].ToString(),

                        BookAuthor = dr[2].ToString(),

                        BookPicture = dr[3].ToString(),

                        BookDescription = dr[4].ToString(),

                        BookPrice = int.Parse(dr[5].ToString())

                        }

                       );

               }

           }

           con.Close();

# January 4, 2012 2:45 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 6 and 6 and type the answer here:


Enter the numbers above: