天天看點

新瓶舊酒ASP.NET AJAX(9) - 用戶端腳本程式設計(Sys.Net命名空間下的WebServiceProxy)

<a href="http://webabcd.blog.51cto.com/1787395/344663" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/100916" target="_blank">[源碼下載下傳]</a>

新瓶舊酒ASP.NET AJAX(9) - 用戶端腳本程式設計(Sys.Net命名空間下的WebServiceProxy、WebServiceError、Generated Proxy Classes以及調用WebService、PageMethod)

介紹

使用ASP.NET AJAX調用WebService(簡單類型和複雜對象、JSON和XML)和PageMethod。Sys.Net命名空間下的WebServiceProxy Class、WebServiceError Class、Generated Proxy Classes

關鍵

1、調用WebService

    ·為WebService類或需要暴露給用戶端的WebService方法添加[System.Web.Script.Services.ScriptService]屬性

    ·為WebService類中需要暴露給用戶端使用的方法添加[System.Web.Services.WebMethod]屬性

    ·在ScriptManager控件的Services集合中添加對該WebService的引用

    ·用戶端調用方法:[NameSpace].[ClassName].[MethodName](param1, param2, ..., succeededCallback, failedCallback, userContext)

    ·如果用GET方式的話,則在WebService方法添加[System.Web.Script.Services.ScriptMethod(UseHttpGet = true)]屬性

    ·用到了複雜類型的話,則在WebService類上添加[System.Web.Script.Services.GenerateScriptType(typeof(TypeName))]屬性。另外,該複雜類型必須要有一個無參數的構造函數

    ·禁止将某屬性輸出到用戶端,則在該屬性上添加[System.Web.Script.Serialization.ScriptIgnore]屬性

    ·以XML方式輸出到用戶端(一般是JSON),則在WebService方法添加[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]屬性。如果要避免ASP.NET AJAX為我們做自動轉換,則應該添加[ScriptMethod(ResponseFormat = ResponseFormat.Xml, XmlSerializeString = true)]屬性

    ·以XML方式輸出到用戶端的複雜對象的屬性,在屬性上添加[System.Xml.Serialization.XmlAttribute]屬性(可不寫)。若禁止将其輸出到用戶端,則在屬性上添加[System.Xml.Serialization.XmlIgnore]屬性。

    ·WebService判斷使用者是否通過驗證 - HttpContext.Current.User.Identity.IsAuthenticated

    ·WebService使用Session - HttpSessionState session = HttpContext.Current.Session;

2、調用PageMethod

    ·ASP.NET頁面中的方法需要時Public和Static的

    ·為該方法添加[System.Web.Services.WebMethod]屬性

    ·設定ScriptManager控件的EnablePageMethods="true"

    ·用戶端調用方法:PageMethods.[MethodName](param1, param2, ..., callbackFunction);

3、WebServiceProxy Class

    var webRequest = Sys.Net.WebServiceProxy.invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);

    ·path - WebService的url

    ·methodName - 調用的方法名

    ·useHttpGet - 是否使用HTTP GET方式

    ·parameters - 參數(示例:{"param1":196610, "param2":"Hello"})

    ·succeededCallback - 調用成功的回調函數

    ·failedCallback - 調用失敗的回調函數

    ·userContext - 使用者上下文

    ·timeout - 逾時時間

    ·傳回值 - 相關的WebRequest對象

4、WebServiceError Class

    ·exceptionType - 伺服器端異常的具體類型

    ·message - 詳細的異常描述資訊

    ·stackTrace - 伺服器端異常的堆棧跟蹤資訊

    ·statusCode - 造成異常的HTTP響應的狀态碼

    ·timedOut - 異常是否是由于網絡連接配接逾時造成的

5、Generated Proxy Classes屬性

    ·defaultSucceededCallback - 調用成功的回調函數

    ·defaultFailedCallback - 調用失敗的回調函數

    ·defaultUserContext - 使用者上下文

    ·path - WebService的路徑

6、Generated Proxy Classes(調用Web Service)

    var myServiceProxy = MyNameSpace.MyService();

    myServiceProxy.MyServiceMethod(param1, param2, ..., succeededCallback, failedCallback, userContext);

    ·param - 在前面順序地寫參數

    ·userContext - 調用成功的回調函數

7、Generated Proxy Classes(調用成功的回調函數)

    function succeededCallback(result, userContext, methodName) { }

    ·result - 調用WebService的方法後傳回的資料

8、Generated Proxy Classes(調用失敗的回調函數)

    function failedCallback(error, userContext, methodName) { }

    ·error - 調用WebService的方法後傳回的資料(Sys.Net.WebServiceError對象)

示例

Hello.asmx

&lt;%@ WebService Language="C#" Class="Hello" %&gt; 

using System; 

using System.Web; 

using System.Web.Services; 

using System.Web.Services.Protocols; 

using System.Web.Script.Services; 

[WebService(Namespace = "http://tempuri.org/")] 

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 

[ScriptService] 

public class Hello : System.Web.Services.WebService 

        [WebMethod] 

        // 如果用GET方式的話,[ScriptMethod(UseHttpGet = true)] 

        public string Say(string name) 

        { 

                return String.Format("WebService Hello {0}", name); 

        } 

        public int SayError(int a, int b) 

                return a / b; 

}

Hello.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" Title="WebService、PageMethod、WebServiceError Class" %&gt; 

&lt;%@ Import Namespace="System.Web.Services" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; 

        &lt;script runat="Server"&gt; 

                [WebMethod] 

                public static string Say(string name) 

                { 

                        return String.Format("PageMethod Hello {0}", name); 

                } 

        &lt;/script&gt; 

        &lt;asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"&gt; 

                &lt;services&gt; 

                        &lt;asp:ServiceReference Path="Hello.asmx" /&gt; 

                &lt;/services&gt; 

        &lt;/asp:ScriptManagerProxy&gt; 

        &lt;input type="text" id="txtName" value="webabcd" /&gt; 

        &lt;input type="button" id="btnHelloWebService" value="HelloWebService" /&gt; 

        &lt;input type="button" id="btnHelloPageMethod" value="HelloPageMethod" /&gt; 

        &lt;input type="button" id="btnContext" value="HelloContext" /&gt; 

        &lt;input type="button" id="btnHelloError" value="HelloError" /&gt; 

        &lt;br /&gt;&lt;br /&gt; 

        &lt;div id="result" /&gt; 

        &lt;script type="text/javascript"&gt; 

                function btnHelloWebService_click()    

                        var name = $get("txtName").value; 

                        Hello.Say(name, onSucceeded); 

                function btnHelloPageMethod_click()    

                        PageMethods.Say(name, onSucceeded); 

                function btnHelloContext_click()    

                        Hello.Say(name, onHelloContextSucceeded, null, jsonContext); 

                function btnHelloError_click()    

                        Hello.SayError(100, 0, onSucceeded, onFailed); 

                function onSucceeded(result)    

                        $get("result").innerHTML = result + "&lt;br /&gt;"; 

                function onHelloContextSucceeded(result, context)    

                        $get("result").innerHTML += context.Name + "&lt;br /&gt;"; 

                        $get("result").innerHTML += context.Age + "&lt;br /&gt;"; 

                function onFailed(error)    

                        // error - Sys.Net.WebServiceError對象 

                        // exceptionType - 伺服器端異常的具體類型 

                        $get("result").innerHTML = "Exception Type:" + error.get_exceptionType() + "&lt;br /&gt;"; 

                        // message - 詳細的異常描述資訊 

                        $get("result").innerHTML += "Message:" + error.get_message() + "&lt;br /&gt;"; 

                        // stackTrace - 伺服器端異常的堆棧跟蹤資訊 

                        $get("result").innerHTML += "Stack Trace:" + error.get_stackTrace() + "&lt;br /&gt;"; 

                        // statusCode - 造成異常的HTTP響應的狀态碼 

                        $get("result").innerHTML += "Status Code:" + error.get_statusCode() + "&lt;br /&gt;"; 

                        // timedOut - 異常是否是由于網絡連接配接逾時造成的 

                        $get("result").innerHTML += "Timed Out:" + error.get_timedOut() + "&lt;br /&gt;"; 

                var jsonContext =    

                        Name: "webabcd", 

                        Age: 27 

                }; 

&lt;/asp:Content&gt;

運作結果

1、單擊“HelloWebService”按鈕

WebService Hello webabcd

2、單擊“HelloPageMethod”按鈕

PageMethod Hello webabcd

3、單擊“HelloContext”按鈕

webabcd

27

4、單擊“HelloError”按鈕

Exception Type:System.DivideByZeroException

Message:試圖除以零。

Stack Trace: 在 Hello.SayError(Int32 a, Int32 b) 位置 c:\Documents and Settings\wanglei\桌面\AJAX\Web\WebService\Hello.asmx:行号 25

Status Code:500

Timed Out:false

Sample.asmx

&lt;%@ WebService Language="C#" Class="Sample" %&gt; 

using System.Collections.Generic; 

using System.Text; 

using System.Data; 

[GenerateScriptType(typeof(Person))] 

public class Sample : System.Web.Services.WebService 

        public string SimpleTypeTest( 

                string stringTest, bool boolTest, int intTest, float floatTest, 

                DateTime datetimeTest, DayOfWeek enumTest) 

                return String.Format("stringTest:{0};boolTest:{1};intTest:{2};floatTest:{3};datetimeTest:{4};enumTest:{5}", 

                        stringTest, boolTest, intTest, floatTest, datetimeTest, enumTest); 

        public Person GetPerson() 

                return new Person("webabcd", 27); 

        public string SetPerson(Person p) 

                return String.Format("Name:{0};Age:{1}", p.Name, p.Age); 

        public List&lt;Person&gt; GetList() 

                List&lt;Person&gt; list = new List&lt;Person&gt;(); 

                for (int i = 0; i &lt; 10; i++) 

                        Person p = new Person(i.ToString().PadLeft(4, '0'), i + 20); 

                        list.Add(p); 

                return list; 

        public string SetList(List&lt;Person&gt; list) 

                StringBuilder sb = new StringBuilder(); 

                sb.Append("&lt;table border='1'&gt;"); 

                foreach (Person p in list) 

                        sb.Append("&lt;tr&gt;"); 

                        sb.Append("&lt;td&gt;Name:" + p.Name + "&lt;/td&gt;"); 

                        sb.Append("&lt;td&gt;Age:" + p.Age + "&lt;/td&gt;"); 

                        sb.Append("&lt;/tr&gt;"); 

                sb.Append("&lt;/table&gt;"); 

                return sb.ToString(); 

        public Dictionary&lt;string, Person&gt; GetDictionary() 

                Dictionary&lt;string, Person&gt; dictionary = new Dictionary&lt;string, Person&gt;(); 

                        dictionary.Add(i.ToString(), p); 

                return dictionary; 

        public DataTable GetDataTable() 

                DataTable dt = new DataTable(); 

                dt.Columns.Add(new DataColumn("Name", typeof(string))); 

                dt.Columns.Add(new DataColumn("Age", typeof(int))); 

                        DataRow dr = dt.NewRow(); 

                        dr["Name"] = i.ToString().PadLeft(4, '0'); 

                        dr["Age"] = i + 20; 

                        dt.Rows.Add(dr); 

                return dt; 

        [ScriptMethod(ResponseFormat = ResponseFormat.Xml)] 

        // 避免ASP.NET AJAX為我們做自動轉換,[ScriptMethod(ResponseFormat = ResponseFormat.Xml, XmlSerializeString = true)] 

        public List&lt;Person&gt; GetXml() 

                return GetList(); 

Sample.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" Title="WebService(簡單類型和複雜對象、JSON和XML)" %&gt; 

                        &lt;asp:ServiceReference Path="Sample.asmx" /&gt; 

        &lt;input type="button" id="btnSimpleTypeTest" value="SimpleTypeTest" /&gt; 

        &lt;input type="button" id="btnGetPerson" value="GetPerson" /&gt; 

        &lt;input type="button" id="btnSetPerson" value="SetPerson" /&gt; 

        &lt;input type="button" id="btnGetList" value="GetList" /&gt; 

        &lt;input type="button" id="btnSetList" value="SetList" /&gt; 

        &lt;input type="button" id="btnGetDictionary" value="GetDictionary" /&gt; 

        &lt;input type="button" id="btnGetDataTable" value="GetDataTable" /&gt; 

        &lt;input type="button" id="btnGetXml" value="GetXml" /&gt; 

        &lt;script type="Text/javascript"&gt; 

                function btnSimpleTypeTest_click()    

                        Sample.SimpleTypeTest("abc", false, 1, 1.1, new Date(), System.DayOfWeek.Sunday, onSimpleTypeTestSucceeded); 

                function onSimpleTypeTestSucceeded(result)    

                function btnGetPerson_click()    

                        Sample.GetPerson(onGetPersonSucceeded); 

                function onGetPersonSucceeded(result)    

                        $get("result").innerHTML = String.format("Name:{0};Age:{1}&lt;br /&gt;", result.Name, result.Age); 

                function btnSetPerson_click()    

                        // var p = new Object(); 

                        var p = new Person(); 

                        p.Name = "webabcd"; 

                        p.Age = 27; 

                        Sample.SetPerson(p, onSetPersonSucceeded); 

                function onSetPersonSucceeded(result) 

                function btnGetList_click()    

                        Sample.GetList(onGetListSucceeded); 

                function onGetListSucceeded(result)    

                        var sb = new Sys.StringBuilder(); 

                        sb.append("&lt;table border='1'&gt;"); 

                        for (var i=0; i&lt;result.length; i++) 

                        { 

                                sb.append("&lt;tr&gt;"); 

                                sb.append("&lt;td&gt;Name:" + result[i].Name + "&lt;/td&gt;"); 

                                sb.append("&lt;td&gt;Age:" + result[i].Age + "&lt;/td&gt;"); 

                                sb.append("&lt;/tr&gt;"); 

                        } 

                        sb.append("&lt;/table&gt;"); 

                        $get("result").innerHTML = sb.toString(); 

                function btnSetList_click()    

                        var ary = new Array(); 

                        for (var i = 0 ; i &lt; 10; i++)    

                                var p = new Person(); 

                                p.Name = i + 1000; 

                                p.Age = i + 20; 

                                Array.add(ary, p); 

                        Sample.SetList(ary, onSetListSucceeded); 

                function onSetListSucceeded(result)    

                        $get("result").innerHTML = result; 

                function btnGetDictionary_click()    

                        Sample.GetDictionary(onGetDictionarySucceeded); 

                function onGetDictionarySucceeded(result)    

                {                 

                        for (var key in result) 

                                var p = result[key]; 

                                sb.append("&lt;td&gt;Name:" + p.Name + "&lt;/td&gt;"); 

                                sb.append("&lt;td&gt;Age:" + p.Age + "&lt;/td&gt;"); 

                function btnGetDataTable_click()    

                        Sample.GetDataTable(onGetDataTableSucceeded); 

                function onGetDataTableSucceeded(result)    

                        for (var i=0; i&lt;result.rows.length; i++) 

                                sb.append("&lt;td&gt;Name:" + result.rows[i].Name + "&lt;/td&gt;"); 

                                sb.append("&lt;td&gt;Age:" + result.rows[i].Age + "&lt;/td&gt;"); 

                function btnGetXml_click() 

                        Sample.GetXml(onGetXmlSucceeded); 

                function onGetXmlSucceeded(result) 

                        if (document.all) 

                                $get("result").innerText = "\r\n" + result.xml; 

                        else 

                                // Firefox 

                                $get("result").textContent = "\r\n首節點:" + result.documentElement.nodeName; 

1、單擊“SimpleTypeTest”按鈕

stringTest:abc;boolTest:False;intTest:1;floatTest:1.1;datetimeTest:2007-7-5 0:59:35;enumTest:Sunday

2、單擊“GetPerson”按鈕

Name:webabcd;Age:27

3、單擊“SetPerson”按鈕

4、單擊“GetList”按鈕

Name:0000

Age:20

Name:0001

Age:21

Name:0002

Age:22

Name:0003

Age:23

Name:0004

Age:24

Name:0005

Age:25

Name:0006

Age:26

Name:0007

Age:27

Name:0008

Age:28

Name:0009

Age:29

5、單擊“SetList”按鈕

Name:1000

Name:1001

Name:1002

Name:1003

Name:1004

Name:1005

Name:1006

Name:1007

Name:1008

Name:1009

6、單擊“GetDictionary”按鈕

7、單擊“GetDataTable”按鈕

8、單擊“GetXml”按鈕

&lt;?xml version="1.0"?&gt;

&lt;ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;

&lt;Person&gt;&lt;Name&gt;0000&lt;/Name&gt;&lt;Age&gt;20&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0001&lt;/Name&gt;&lt;Age&gt;21&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0002&lt;/Name&gt;&lt;Age&gt;22&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0003&lt;/Name&gt;&lt;Age&gt;23&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0004&lt;/Name&gt;&lt;Age&gt;24&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0005&lt;/Name&gt;&lt;Age&gt;25&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0006&lt;/Name&gt;&lt;Age&gt;26&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0007&lt;/Name&gt;&lt;Age&gt;27&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0008&lt;/Name&gt;&lt;Age&gt;28&lt;/Age&gt;&lt;/Person&gt;

&lt;Person&gt;&lt;Name&gt;0009&lt;/Name&gt;&lt;Age&gt;29&lt;/Age&gt;&lt;/Person&gt;

&lt;/ArrayOfPerson&gt;

GeneratedProxy.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" Title="Generated Proxy Classes" %&gt; 

        &lt;p&gt; 

                調用Web Service 

                &lt;br /&gt; 

                var myServiceProxy = MyNameSpace.MyService(); 

                myServiceProxy.MyServiceMethod(param1, param2, , succeededCallback, failedCallback, 

                userContext); 

        &lt;/p&gt; 

        &lt;ul&gt; 

                &lt;li&gt;param - 在前面順序地寫參數 &lt;/li&gt; 

                &lt;li&gt;succeededCallback - 調用成功的回調函數 &lt;/li&gt; 

                &lt;li&gt;failedCallback - 調用失敗的回調函數 &lt;/li&gt; 

                &lt;li&gt;userContext - 調用成功的回調函數 &lt;/li&gt; 

        &lt;/ul&gt; 

                調用成功的回調函數 

                function succeededCallback(result, userContext, methodName) { } 

                &lt;li&gt;result - 調用WebService的方法後傳回的資料 &lt;/li&gt; 

                &lt;li&gt;userContext - 使用者上下文 &lt;/li&gt; 

                &lt;li&gt;methodName - 調用的方法名 &lt;/li&gt; 

                調用失敗的回調函數 

                function failedCallback(error, userContext, methodName) { } 

                &lt;li&gt;error - 調用WebService的方法後傳回的資料(Sys.Net.WebServiceError對象) &lt;/li&gt; 

                &lt;input type="text" id="txtName" value="webabcd" /&gt; 

                &lt;input type="button" id="btnHello" value="Hello" /&gt; 

                // defaultSucceededCallback - 調用成功的回調函數 

                Hello.set_defaultSucceededCallback(onSucceeded); 

                // defaultFailedCallback - 調用失敗的回調函數 

                Hello.set_defaultFailedCallback(onFailed); 

                // defaultUserContext - 使用者上下文 

                Hello.set_defaultUserContext("webabcd"); 

                // path - WebService的路徑 

                alert(Hello.get_path()); 

                // timeout - 逾時時間 

                alert(Hello.get_timeout()); 

                function btnHello_onclick()    

                        Hello.Say(name); 

                function onSucceeded(result, context, methodName)    

                        $get("result").innerHTML += "預設的Context:" + context + "&lt;br /&gt;"; 

                        $get("result").innerHTML += "調用的方法名:" + methodName + "&lt;br /&gt;"; 

                        $get("result").innerHTML = error.get_message() + "&lt;br /&gt;"; 

1、頁面加載

彈出框,資訊:/Web/WebService/Hello.asmx

彈出框,資訊:0

2、單擊“Hello”按鈕

預設的Context:webabcd

調用的方法名:Say

WebServiceProxy.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" Title="WebServiceProxy Class" %&gt; 

                var webRequest = Sys.Net.WebServiceProxy.invoke(path, methodName, useHttpGet, parameters, 

                succeededCallback, failedCallback, userContext, timeout); 

                &lt;li&gt;path - WebService的url &lt;/li&gt; 

                &lt;li&gt;useHttpGet - 是否使用HTTP GET方式 &lt;/li&gt; 

                &lt;li&gt;parameters - 參數(示例:{"param1":196610, "param2":"Hello"}) &lt;/li&gt; 

                &lt;li&gt;timeout - 逾時時間 &lt;/li&gt; 

                &lt;li&gt;傳回值 - 相關的WebRequest對象 &lt;/li&gt; 

        &lt;input type="button" id="btnHello" value="Hello" /&gt; 

        &lt;br /&gt; 

                function btnHello_ 

                        var wRequest =    

                        Sys.Net.WebServiceProxy.invoke 

                        ( 

                                "Hello.asmx", 

                                "Say", 

                                false, 

                                {"name":'webabcd'}, 

                                onSucceeded, 

                                null, 

                                -1 

                        ); 

                        $get("result").innerHTML = wRequest.get_body() + "&lt;br /&gt;"; 

                function onSucceeded(result) 

                        $get("result").innerHTML += result + "&lt;br /&gt;"; 

1、單擊“Hello”按鈕

{"name":"webabcd"}

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344812,如需轉載請自行聯系原作者

繼續閱讀