پنج شنبه ۴ خرداد ۱۳۹۶
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 

 
 
 فراخوانی توابع وب سرویس با استفاده ASP.NET AJAX
ASP.NET
تاریخ ثبت:  ۸۸/۱/۱۶
تعداد نمایش:  ۷۶۲۸
  نویسنده: میثم نوایی
 
   ۱۵  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

یکی از محبوبترین امکاناتی که امروزه 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() را فراخوانی کنید .دو شرطی نیز که در برنامه داریم چک میکند که آیا سرویس جاری که قصد توقف اش را داریم در برنامه کاربر در حال اجرا می باشد یا خیر.

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
میثم نوایی
www.tazeyab.com/home/about
همه مقاله های نوشته شده توسط این کاربر (۲)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۲ از مجموع ۲ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
تشکر مجید سامانی ۱۳۹۲/۱/۶
 
asp.net 2 ajax فرزاد فضلی ۱۳۸۸/۳/۷
اولین قبلی بعدی

Copyright © 2006 - 2016 All Rights Reserved.
Please direct your questions or comments to