- 決戰(zhàn).NET
- 黃忠成
- 1102字
- 2018-12-27 16:56:01
4.3 與Web Services結(jié)合
除了使用PageMethods輸出靜態(tài)函數(shù)供JavaScript調(diào)用外,ASP.NET AJAX也支持由JavaScript調(diào)用Web Service。用法很簡單,只要在欲輸出的Web Service類上標(biāo)示ScriptService Attribute,再于ScriptManager的Services屬性中設(shè)定URL即可。請依以下的步驟做。
1. 建立一個Web Service,命名為HelloService.asmx。
2. 在HelloService類中鍵入程序4-8的代碼。
3. 建立一個新網(wǎng)頁,命名為CallWebService.aspx。
4. 在頁面上放入ScriptManager控件。
5. 在ScriptManager控件的Services屬性窗中添加一個Service,如圖4-3所示。

圖4-3
6. 在網(wǎng)頁的源碼中鍵入程序4-9粗體字部分。
程序4-8
Samples\4\AjaxDemo2\App_Code\HelloService.cs using System; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; /// <summary> /// Summary description for HelloService /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class HelloService : System.Web.Services.WebService { public HelloService () { //Uncomment the following line if using designed components //InitializeComponent(); } [WebMethod] public string Hello(string name) { return string.Format("Hello {0}",name); } }
程序4-9
Samples\4\AjaxDemo2\CallWebServcie.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CallWebService.aspx.cs" Inherits="CallWebService" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server"> <Services> <asp:ServiceReference Path="HelloService.asmx" /> <asp:ServiceReference Path="ZipServiceProxy.asmx" /> </Services> </asp:ScriptManager> <script language=javascript> function CallService() { var txt = $get('Text1'); HelloService.Hello(txt.value,SucceededCallback); } function SucceededCallback(result) { alert(result); } </script> </div> <input id="Text1" type="text" /> <input id="Button1" type="button" value="call" onclick= "CallService();" />/> </form> </body> </html>
完成后執(zhí)行程序,點擊call按鈕,便可看到如圖4-4所示的結(jié)果。

圖4-4
這是如何辦到的呢?先看程序4-9 中JavaScript的CallService函數(shù),此函數(shù)調(diào)用了Hello-Service.Hello函數(shù),HelloService對應(yīng)了我們剛建立的HelloService.asmx這個Web Service,Visual Studio 2005建立Web Service時默認(rèn)是不會加上任何namespace聲明的,所以這里直接以<Web Service類名>.<函數(shù)名>便可調(diào)用Web Servcie,當(dāng)你為Web Service類加上namespace之后,調(diào)用方式就得變成<namespace>.<Web Service類名>.<函數(shù)名>。JavaScript調(diào)用對應(yīng)的Web Service函數(shù)時,除了傳入該函數(shù)所需要的參數(shù)外(本例是name,字符串類型),還得傳入另一個接收結(jié)果的函數(shù)(本例是OnSucceededCallback函數(shù)),這是因為ASP.NET AJAX調(diào)用Web Servcie時采用異步的方式調(diào)用,當(dāng)調(diào)用完成后,便會調(diào)用所傳入的接收結(jié)果函數(shù),并傳入傳回值。OK,那ASP.NET AJAX是如何調(diào)用Web Service的呢?簡單地說,ASP.NET AJAX替換了Web Service原有的處理機制,加上了一個特殊的參數(shù)/jsdebug,如果你在瀏覽器上鍵入Web Service的URL并加上/jsdebug參數(shù)時,就會得到ASP.NET AJAX為此Web Service所產(chǎn)生出來的Proxy程序文件,如圖4-5所示。

圖4-5
這個Proxy程序文件中聲明了HelloService.Hello函數(shù),并在此函數(shù)中利用ASP.NET AJAX Client Framework所提供的WebServiceProxy對象調(diào)用這個Web Service。在調(diào)用Web Service時,也可以像調(diào)用PageMethods時那樣設(shè)定Timeout及錯誤處理機制,如程序4-10所示。
程序4-10
Samples\4\AjaxDemo2\CallWebServcie.aspx function CallService() { var txt = $get('Text1'); HelloService.set_timeout(5000); HelloService.Hello(txt.value,SucceededCallback,FailedCallback); } function SucceededCallback(result) { alert(result); } function FailedCallback(error) { alert("Call Service Error:"+error.get_message()); }
對Web Service有興趣的讀者或許會問一個問題,那就是在ASP.NET AJAX中,可否調(diào)用外部的Web Service呢?也就是于Service中將Path設(shè)為外部的網(wǎng)站,答案是可以的!不過有幾個限制:第一、該Web Servcie必須也是以ASP.NET建立的,而且必須標(biāo)示為ScriptService。二、受限于XMLHttpRequest不允許跨網(wǎng)域調(diào)用的限制,使用者必須調(diào)整瀏覽器的安全設(shè)定。第二個限制是比較麻煩且難以說服使用者的,所以最好的方式是自己建立一個Web Service,在此Web Service中串接外部的Web Service,這樣不僅可以調(diào)用非ASP.NET所建立的Web Servcie,而且不受XMLHttpRequest不能跨網(wǎng)域的限制。
PageMethods與Web Service
在早期未Release的Atlas Framework中,并未要求PageMethods以靜態(tài)函數(shù)類型聲明,這使得每次Client端調(diào)用PageMethods時,都得經(jīng)過傳統(tǒng)的ASP.NET頁面處理流程,因此讓PageMethods背上效率不高的惡名。在ASP.NET AJAX正式版推出后,要求PageMethods一定得是靜態(tài)函數(shù),原因就是要繞過傳統(tǒng)的ASP.NET頁面處理流程,所以在ASP.NET AJAX正式版中,PageMethods已經(jīng)與Web Service的性能不相上下了。另外,ASP.NET AJAX正式版中,你甚至可以將PageMethods當(dāng)Web Servcie用,只要在ScriptManager控件的Services屬性窗上添加Service時,將其Path設(shè)定為提供PageMethods的那個.aspx文件即可。
- 大數(shù)據(jù)管理系統(tǒng)
- 人工智能超越人類
- JavaScript實例自學(xué)手冊
- Getting Started with MariaDB
- Hands-On Machine Learning with TensorFlow.js
- 工業(yè)機器人入門實用教程(KUKA機器人)
- 讓每張照片都成為佳作的Photoshop后期技法
- 數(shù)據(jù)挖掘方法及天體光譜挖掘技術(shù)
- Supervised Machine Learning with Python
- 網(wǎng)絡(luò)綜合布線設(shè)計與施工技術(shù)
- Learning Azure Cosmos DB
- 面向?qū)ο蟪绦蛟O(shè)計綜合實踐
- Windows Server 2008 R2活動目錄內(nèi)幕
- 智能生產(chǎn)線的重構(gòu)方法
- 液壓機智能故障診斷方法集成技術(shù)