בתפוז עלתה השאלה כיצד מתחילים לעבוד עם web services, בפוסט זה אני אדגים את השלבים צעד אחר צעד לאלו המתחילים את דרכם בעולם ה - web.
בפרוייקט ה - web צריך להוסיף item חדש מסוג web service (סיומת asmx) - נקרא לו MyWebService.
יווצרו שני קבצים - הראשון MyWebService.asmx שאם תלחצו עליו עם העכבר ותבחרו ב - View Markup תראו שיש בו את השורה הבאה בלבד
<%@ WebService Language="C#" CodeBehind="MyWebService.asmx.cs" Class="WebApplication10.MyWebService" %>
שכל מה שכתוב כאן - היכן נמצא הקוד של ה - WebService.
הקובץ השני נקרא MyWebService.asmx.cs המכיל את הקוד שלנו.
כברירת מחדל נקבל את הקוד הבא:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class MyWebService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
לפני שנמשיך חשוב להבין מה המשמעות של Web Service.
כשאחנו כותבים אפליקצייה רגילה (כלומר רצה על המחשב של הלקוח) לדוגמא - מחשבון, ונרצה לכתוב פונקציה שמקבלת שני מספרים ומחזירה את הסכום שלהם, נכתוב בפשטות מתודה כזו:
public int Add(int a, int b)
{
return a + b;
}
סביר להניח שיהיה לחצן כלשהו שיקרא למתודה זו - כל התיאור הנ"ל מתבצע על המחשב שעליו האפליקצייה רצה,
לפעמים נרצה לכתוב אפלקיצה מסוג לקוח-שרת, כלומר הלקוח יראה מסך ולחצנים ומדי פעם כשנצטרך לחשב משהו נפנה למחשב אחר (השרת) שיעשה עבורנו את החישוב.
כמובן שלא עבור כל דבר נרצה לפנות לשרת וחישובים שאפשר לעשות אצל הלקוח נעשה אצלו כדי לחסוך את הפנייה לשרת,
אך ישנם דברים שחייבים לעשות בצד השרת (כמו בדיקת שם משתמש וסיסמא).
אתרי אינטרנט מטבעם מתנהגים בצורה זו, אך web services מספקים את היכולת להפעיל אותם מרחוק גם עבור אפליקציות שאינם אתרי web.
כדי לעשות זאת נצטרך לבצע את התהליך שאיתו התחלנו את הפוסט, ונשים לב שיש למחלקה שלנו attribute בשם WebService.
הדבר החשוב הבא הוא - כל מתודה שנצרה להפעיל אותה מרחוק נוסיף עליה את ה - WebMethod, לדוגמא:
[WebMethod]
public int Add(int a, int b)
{
return a + b;
}
כעת ניתן יהיה להפעיל מתודה זו מרחוק (ממחשב אחר) - מיד נראה כיצד.
המתודה לא יכולה להיות סטטית.
ה - attribute מקבל מספר פרמטרים - החשוב שבהם נקרא EnableSession
[WebMethod(EnableSession = true)]
public int Add(int a, int b)
{
HttpContext.Current.Session["key"] = "value";
return a + b;
}
אני לא ארחיב בפוסט זה על תפקיד ה - Session, אך אציין שבמידה ואתם צריכים לשמור או לקרוא מידע בצד השרת ותרצו להשתמש ב - Session, צריך להוסיף את ההגדרה הזו.
(כדי לאפשר שימוש ב - asp.net ajax (כלומר - קריאה למתודות מקבצי javascript באמצעות ScriptManager) צריך להוריד את ההערה מ - ScriptService - למידע נוסף ומפורט בנושא, ניתן לקרוא
במדריך השלם ל - ajax)
כעת נעבור לצד השני (כלומר מי שהולך להפעיל את המתודה מרחוק)
בפרוייקט אחר (לא חייב להיות באותו Solution) נלחץ לחיצה ימנית על הפרוייקט ונבחר ב - Add Service Reference.
במסך שיפתח לכם תוכלו להקליד את כתובת ה - web service או ללחוץ על Discover במידה ופרוייקט ה - WebService נמצא באותו Solution.
תקבלו את המסך הבא:
כעת תוכלו לכתוב את הקוד הבא:
static void Main(string[] args)
{
ServiceReference1.MyWebServiceSoapClient client = new ServiceReference1.MyWebServiceSoapClient();
int res = client.Add(1, 2);
Console.WriteLine(res);
}
כשבפועל הקריאה ל - Add תפנה לשרת ולא תבוצע על המחשב שלכם. (כמובן שבזמן הפיתוח אתם בדרך כלל גם הלקוח וגם השרת).
אחד הדברים הנחמדים שניתן לבצע הוא לחיצה על Advanced ולסמן את Generate asynchronous operations - ואז ניתן להפעיל כל מתודה בצורה אסינכרונית, לדוגמא:
static void Main(string[] args)
{
ServiceReference1.MyWebServiceSoapClient client = new ServiceReference1.MyWebServiceSoapClient();
client.AddCompleted += client_AddCompleted;
client.AddAsync(1, 3);
Console.ReadLine();
}
static void client_AddCompleted(object sender, ServiceReference1.AddCompletedEventArgs e)
{
Console.WriteLine(e.Result);
}
במידה ונרצה ליצור אצל הלקוח שימוש ב - WebService (כמו פעם) ולא להשתמש ב - WCF, נוכל ללחוץ בתוך Advanced על Add Web Reference, נקבל את המסך הבא:
כעת ניתן להכניס את הכתובת או ללחוץ על Web Service in this solution
לאחר אישור ולחיצה על Add Reference - יווצר proxy שיעבוד בפרוטוקול SOAP, וניתן יהיה לכתוב קוד כזה:
localhost.MyWebService service = new localhost.MyWebService();
Console.WriteLine(service.Add(1, 3));
יש עוד מה להרחיב על הנושא, אך תיאור זה הינו מספק כדי להתחיל לעבוד עם Web Services