ASP.NET AJAX調用WebService

如何在客戶端直接調用WebService中的方法?html

這裏結合經驗本身寫一寫
1.首先新建一個 ASP.NET AJAX-Enabled Web Site,這樣系統爲咱們自動配置好了環境,這主要體如今Web.config這個文件上,若是已有網站不是ASP.NET AJAX-Enabled Web Site也能夠對照修改下Web.config,也能夠達到相同的效果。
2.新建一個web服務,WebService.asmx,在WebService.cs須要添加System.Web.Script.Services;這個命名空間:
using System.Web.Script.Services;
而後給WebService 類添加[ScriptService]屬性這裏先說步驟,後面說原理,而後給咱們須要調用的方法加上
[WebMethod]屬性
3.新建一個JScript文件,JScript.js,裏面用來響應界面事件處理回調方法返回的數據
4.新建一個頁面Default.aspx,若是是ASP.NET AJAX-Enabled Web Site頁面上會自動添加ScriptManager控件,若是不是隻要手工拖上去一個,而後給ScriptManager添加Script節點,這個節點用來指定要使用的js文件
<Scripts><asp:ScriptReference Path="~/JScript.js" /></Scripts>
再給ScriptManager添加Services節點,這個節點用來指定要使用的WebService
<Services><asp:ServiceReference Path="~/WebService.asmx" /></Services>
這些工做完成後只要在界面上某個控件或者某個地方調用咱們的js方法就能夠了。
說的是調用本地的WebService,若是是調用網上的WebService,原理也是同樣,不過須要添加點東西,就拿「一些經常使用的WebServices」中的第一個WebService來講吧,天氣預報Web服務,在網站上添加web引用,

在url地址中填入地址服務地址,前往,而後添加引用就能夠了,其它處理和本地同樣。
貼一下代碼,包括本地的web服務和遠程web服務
I.Default.aspx代碼:
<html xmlns="[color=#000000]http://www.w3.org/1999/xhtml[/color]">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" >
        <Scripts>
            <asp:ScriptReference Path="~/JScript.js" />
        </Scripts>
        <Services>
            <asp:ServiceReference Path="~/WebService.asmx" />
        </Services>
        </asp:ScriptManager>
        <input type="button" value="問好!" /><p/>
         <input type="button" value="北京天氣!" />
        <div id="result">
        </div>
    </form>
</body>
</html>
II.JScript.js代碼:

    //問好方法
    function SayHello() {
            WebService1.HelloWorld(completeAjax);
        }
    //問好回調方法
      function completeAjax(result) {
        document.getElementById("result").innerHTML = result;
        }
        //天氣方法
        function GetData(cityName)
        {
            WebService1.getWeather(cityName,complete);
        }
       //天氣回調方法
        function complete(result)
        {
            var data ="";
            for(i =0;i<result.length;i++)
            {
                data+=result+"<br/>"
            }
document.getElementById("result").innerHTML = data;      
        }

III.WebService.cs代碼:
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
/// <summary>
/// WebService 的摘要說明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
[ScriptService]
public class WebService1 : System.Web.Services.WebService {
      public WebService1 () {
            //若是使用設計的組件,請取消註釋如下行  
            //InitializeComponent();  
    }
    [WebMethod]
      public string HelloWorld() {
            return "你好啊";          
    }
    /// <summary>
      /// 獲得今天和明天、後天的天氣及穿衣指數 等等
    /// </summary>
      /// <param name="cityName"></param>
      /// <returns></returns>
    [WebMethod]
      public string[] getWeather(string cityName)
    {
            cn.com.webxml.www.WeatherWebService wws = new cn.com.webxml.www.WeatherWebService();
            return wws.getWeatherbyCityName(cityName);
    }
}
運行效果就不貼圖了,若是有興趣本身試驗一下就知道了

在JScript.js中咱們直接調用WebService1類的HelloWorld方法,雖然咱們說是「直接調用」,但這是指在語法層面上「直接調用」。而實際上,JavaScript代碼是不可能真正直接調用後臺程序的,這中間必定使用了XMLHttpRequest對象。那麼,究竟是什麼給咱們實施了「障眼法」?答案看下圖:
web


上圖就是這個所謂「直接調用」真正的祕密。
如圖,如今假設有個WebService類,名爲Class1,有兩個方法:Method1和Method2。當這個WebService被咱們用上面提到的方法處理事後,ASP.NET AJAX框架就會自動分析這個類,而且在客戶端生成一個這個類的客戶端代理(Proxy),這個代理類是一個JavaScript對象,其類名、方法名都和後臺類一致。而當咱們從客戶端的JS腳本調用時,實際上調用的是這個代理類,而代理類則使用XMLHttpRequest對象,經過傳統的Ajax方式,調用後臺類。這樣,咱們就感受好像在前臺直接調用後臺相似的。
    但是……哪裏彷佛仍是不同……
    經過上面的分析,咱們知道,ASP.NET AJAX調用後臺方法,說到底仍是使用的XMLHttpRequest對象,這樣傳統Ajax的限制,就使得咱們不可能真的像在後臺調用方法同樣方便。
    例如,咱們在後臺都是用「變量=類名.方法名」或者「變量=對象名.方法名」的方式調用,這樣變量就直接獲取了這個方法的返回值,可是Ajax不行,它必須經過回調函數獲取返回值,這一點也體如今了ASP.NET AJAX的使用方法上。看上一篇文章的例子就知道,即便使用了ASP.NET AJAX框架,仍然仍是須要用回調函數的,只不過是語法上簡化了。
下面,正式給出調用後臺類的語法:
    類名.方法名(參數1,參數2,……,參數n,回調函數)
    也就是說,調用上有兩個差異:一是不須要使用變量接收返回值,二是要在全部參數後面加一個參數:回調函數。例如,有個類的方法,在後臺調用是:
var1 = Class1.Method1(Para1,Para2);  
    換到前臺JS調用時,就是以下的樣子:
Class1.Method1(Para1,Para2,CallBackFunction);  
例上面的  
//天氣方法
        function GetData(cityName)
        {
            WebService1.getWeather(cityName,complete);
         }

    那麼,返回值到哪裏去取呢?答案是到回調函數中,回調函數的原型是:回調函數名(返回值)。固然,存儲返回值變量的名字是開發人員隨意取的,而後就能夠在回調函數中使用這個返回值變量了
。例如,接着上面程序,寫一個函數:
function CallBackFunction(result){}    
    則在這個函數中,result就含有Class1.Method1(Para1,Para2,CallBackFunction);的返回值。
例上面的
      //天氣回調方法
        function complete(result)
        {
            var data ="";
            for(i =0;i<result.length;i++)
            {
                data+=result+"<br/>";
            }
            document.getElementById("result").innerHTML = data;        
        }

爲何不直接調用類中的方法,而非要通過WebService呢?
    上文我曾經說過,ASP.NET AJAX容許咱們直接調用後臺類中的方法,可是咱們不提倡這樣作,而是提倡通過WebService的過渡。其緣由有以下幾點:
    1.要使得某個類能夠被JS調用,也須要在其中作一些修改,如增長一些屬性(Attribute)等,這會對這些類形成一種「污染」。
    2.咱們知道了,使用ASP.NET AJAX框架也須要從回調函數中獲取返回值,而不是直接獲取。考慮如下狀況:若是某段JS須要調用三個後臺方法完成一個操做,那麼,就須要寫三個回調函數。即要通過
「調用第一個方法-第一個回調函數中調用第二個方法-第二個回調函數中調用第三個方法-第三個回調函數中取得返回值」。
    這個過程很麻煩。而使用WebService後,咱們能夠將這個三個方法封裝到一個WebService方法裏,由於WebService是支持「變量=類名.方法名」這種傳統的調用方法的。這樣通過WebService過渡,JS
中只要一個回調函數就能夠了。
    3.從自己特性上看,WebService比普通類更適合做爲Ajax的後臺方法。框架

相關文章
相關標籤/搜索