הפעלה של מתודה מ - Web Service שנמצאת בדומיין אחר מתוך JavaScript
כתבתי כמה
פוסטים על הפעלה של WebService מתוך JavScript ומקבלים תוצאות ב - JSON.
זה עובד מעולה בתוך אותו דומיין.
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)