یکی از محبوبترین امکاناتی که امروزه Asp.net
Ajax در اختیار کاربرانش قرار داده قابلیت فراخوانی توابع وب سرویس با
استفاده ار جاوا اسکریپت در سمت کلاینت است!!
این کار قبلا تنها در مرورگر IE امکان پذیر بود
آنهم به شیوه ای تقریبا غیر اصولی به صورتی که شما یک کلاس سرویس تان را به
یک Dom Object مثل Div انتصاب می دادید سپس به شکلی عجیب قریب توابع خود را
روی متغییر جدید فراخوانی می کردید!!
اما امروزه Asp.net Ajax رهیافت جدیدی را در
این زمینه ارائه کرده است که توسط همه مرورگر ها پشتیبانی می شود و نیز به
صورت فوق العاده ای نسبت روش های پیشین امن تر،کارآمدتر و ساده تر می باشد.
برای استفاده از این نعمت شما کافی است یک
پروژه وب از نوع Ajax enable بسازید سپس آدرس سرویس خود را به قسمت
services کنترل Script manager اضافه کنید.
و توابع سرویس خود را بعد از نام کلاستان می
توانید توسط توابع جاوااسکریپت فراخوانی کنید.
با هم یک مثال را مرور می کنیم:
1.ابتدا
یک کلاس سرویس ساده ماشین حساب درست می کنیم:
[ScriptService]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo =
WsiProfiles.BasicProfile1_1)]
public class CalculatorService : WebService
{
[ScriptMethod]
[WebMethod]
public Int32 Add(Int32 a, Int32 b)
{
return (a + b);
}
[ScriptMethod]
[WebMethod]
public string Test()
{
return “Hello world”;
}
}
نکته اینکه:نوشتن دو خصوصیت [ScriptMethod]
و [WebMethod] ضروری می باشد.اولی
برای اینکه توابع شما از طریق Ajax قابل فراخوانی باشد و دومی نیز برای
اینکه برنامه شما با این تابع به عنوان یک سرویس برخورد کند.در ضمن تابع
شما حتما باید public باشد.
2.سپس آدرس سرویس مان را به کنترل Script manager اضافه می
کنیم:
<asp:ScriptManager ID="ScriptManager" runat="server">
<Services>
<asp:ServiceReference
Path="~/CalculatorService.asmx" />
</Services>
</asp:ScriptManager>
3.حال میتوانید یک دکمه ار نوع HTML یا ASP به
صفحه تان اضافه کنید و تابع سرویس را فراخوانی کنید:
<asp:Button runat="server" ID="Button1" OnClientClick="CalculatorService.Add(1,
1, onAddSuccess,
onAddFailure, null)" Text="Add 1 + 1" />
نکته اینکه: اگر مثل من از دکمه از نوع asp
استفاده میکنید حتما تابع خود را در
رویداد OnClientClick فراخوانی کنید البته اگر می خواهید صفحه شما
اصلا post back نشود بهتر است
از کنترل های HTML استفاده کنید.
4. حال توابع جاوااسکریپت زیر را به کد خود
اضافه کنید:
<script type="text/javascript">
function onAddSuccess(result, context,
functionName)
{
alert('Result: ' + result);
}
function onAddFailure(error, context,
functionName)
{
alert('Error: ' + error);
}
</script>
اگر برنامه شما بتواند با موفقیت تابع سرویس
تان را فراخوانی کند،آنگاه مقدار برگشتی حاصل را به تابع onAddSuccess پاس
می دهد و مقدار برگشتی در پارامتر اولی تابع قرار میگیرد (در اینجا result
) و اگر در روند فراخوانی خطایی رخ دهد تابع onAddFailure فراخوانی شده و
خطای رخ داده هم در پارامتر اولی قرار میگیرد.
حالا میرسیم به بحث اصلی یعنی اینکه چطور میشود
در حین اینکه یک تابع در حال فراخوانی میباشد
از ادامه اجرای آن صرفنظر کرد و در واقع فرایند را در سمت سرور
متوقف کرد.
این روند کمی پیچیده تر از بلا می باشد که
البته سعی میکنم با ذکر یک مثال موضوع را به شکل قابل فهم و ساده تری بیان
کنم.
تنها نیاز به این بخش از کد به زیان
جاوااسکریپت دارید.
var lastExecutor;
function test()
{
var
service = Sys.Net.WebServiceProxy.invoke(CalculatorService.asmx'
, 'Test', false, {}, success, fail, '', -1);
lastExecutor = service.get_executor();
}
function endMethod()
{
if(lastExecutor
!= null)
{
if(lastExecutor.get_started())
{
lastExecutor.abort();
}
}
}
function success(res)
{
alert(res);
}
function fail(res)
{
alert('fail');
}
کد خود به تنهایی گویا می باشد.اما فقط نکاتی
را متذکر میشوم.
ابتدا اینکه در خط:
var service = Sys.Net.WebServiceProxy.invoke(CalculatorService.asmx'
, 'Test', false, {}, success, fail, '', -1);
ما تابع Test سرویس ماشین حساب را فراخوانی
کرده ایم و حاصل را به سمت تابع success رهنمون کرده ایم و در صورت بروز
خطا نیز کار به تابع fail سپرده میشود اما این صورت قضیه است و در واقع متد
invoke از کلاس WebServiceProxy برای ما یک شی از نوع کلاس WebRequest
برمیگرداند و آنرا در یک متغییر به نام service
میریزیم.
حالا شما تنها نیاز دارید روی شی که تابع
get_executor برمیگرداند(service.get_executor();) تابع abort() را
فراخوانی کنید .دو شرطی نیز که در برنامه داریم چک میکند که آیا سرویس جاری
که قصد توقف اش را داریم در برنامه کاربر در حال اجرا می باشد یا خیر.