0

فراخوانی توابع وب سرویس با استفاده ASP.NET AJAX

 
mohamadaminsh
mohamadaminsh
کاربر طلایی1
تاریخ عضویت : دی 1389 
تعداد پست ها : 25772
محل سکونت : خوزستان

فراخوانی توابع وب سرویس با استفاده ASP.NET AJAX
چهارشنبه 24 خرداد 1391  6:09 PM


فراخوانی توابع وب سرویس با استفاده ASP.NET AJAX
 
 


یکی از محبوبترین امکاناتی که امروزه 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 اضافه می کنیم.
3.حال میتوانید یک دکمه ار نوع HTML یا ASP به صفحه تان اضافه کنید و تابع سرویس را فراخوانی کنید.
نکته اینکه: اگر مثل من از دکمه از نوع asp استفاده میکنید حتما تابع خود را در رویداد OnClientClick فراخوانی کنید البته اگر می خواهید صفحه شما اصلا post back نشود بهتر است از کنترل های HTML استفاده کنید.
4. حال توابع جاوااسکریپت را به کد خود اضافه کنید.
اگر برنامه شما بتواند با موفقیت تابع سرویس تان را فراخوانی کند،آنگاه مقدار برگشتی حاصل را به تابع 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() را فراخوانی کنید .دو شرطی نیز که در برنامه داریم چک میکند که آیا سرویس جاری که قصد توقف اش را داریم در برنامه کاربر در حال اجرا می باشد یا خیر.

کریمی که جهان پاینده دارد               تواند حجتی را زنده دارد

 

دانلود پروژه و کارآموزی و کارافرینی

تشکرات از این پست
دسترسی سریع به انجمن ها