官术网_书友最值得收藏!

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所示。

true

圖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é)果。

true

圖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所示。

true

圖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文件即可。

主站蜘蛛池模板: 民权县| 酒泉市| 忻州市| 项城市| 长泰县| 平定县| 叶城县| 宣恩县| 河津市| 赣榆县| 会泽县| 昌平区| 巢湖市| 海晏县| 西充县| 曲沃县| 攀枝花市| 巴中市| 肃南| 逊克县| 双峰县| 临夏市| 安平县| 焦作市| 开化县| 桐城市| 泌阳县| 祁东县| 湖北省| 牟定县| 萨迦县| 余庆县| 仪陇县| 宜昌市| 广饶县| 宿松县| 昆山市| 图片| 麦盖提县| 乐平市| 东宁县|