PDA

View Full Version : فراخوانی توابع وب سرویس با آژاکس



xamfia
پنج شنبه 06 فروردین 1388, 20:21 عصر
یکی از محبوبترین امکاناتی که امروزه 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] ضروری می باشد.اولی برای اینکه توابع شما از طریق 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 فراخوانی شده و خطای رخ داده هم در پارامتر اولی قرار میگیرد.



سپاسگزارم
میثم نوایی
meysam.navaei@gmail.com
http://www.xamfia.com

xamfia
شنبه 05 اردیبهشت 1388, 01:20 صبح
اگر بخواهید از یک کلاس سرویس بیرونی(dll) در برنامه تان استفاده کنید و آن کلاس نیز در یک namespace قرار داشته باشد در هنگام فراخوانی در JS باید حتما نام namespace را قبل از نام کلاستان ذکر کنید.
مثلا:



Xamfia.service service1=new Xamfia.service();