<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
<%@ WebService Language="C#" Class="Hello" %>
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
<%@ Page Language="C#" MasterPageFile="~/Site.master" Title="WebService、PageMethod、WebServiceError Class" %>
<%@ Import Namespace="System.Web.Services" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<script runat="Server">
[WebMethod]
public static string Say(string name)
{
return String.Format("PageMethod Hello {0}", name);
}
</script>
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
<services>
<asp:ServiceReference Path="Hello.asmx" />
</services>
</asp:ScriptManagerProxy>
<input type="text" id="txtName" value="webabcd" />
<input type="button" id="btnHelloWebService" value="HelloWebService" />
<input type="button" id="btnHelloPageMethod" value="HelloPageMethod" />
<input type="button" id="btnContext" value="HelloContext" />
<input type="button" id="btnHelloError" value="HelloError" />
<br /><br />
<div id="result" />
<script type="text/javascript">
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 + "<br />";
function onHelloContextSucceeded(result, context)
$get("result").innerHTML += context.Name + "<br />";
$get("result").innerHTML += context.Age + "<br />";
function onFailed(error)
// error - Sys.Net.WebServiceError對象
// exceptionType - 伺服器端異常的具體類型
$get("result").innerHTML = "Exception Type:" + error.get_exceptionType() + "<br />";
// message - 詳細的異常描述資訊
$get("result").innerHTML += "Message:" + error.get_message() + "<br />";
// stackTrace - 伺服器端異常的堆棧跟蹤資訊
$get("result").innerHTML += "Stack Trace:" + error.get_stackTrace() + "<br />";
// statusCode - 造成異常的HTTP響應的狀态碼
$get("result").innerHTML += "Status Code:" + error.get_statusCode() + "<br />";
// timedOut - 異常是否是由于網絡連接配接逾時造成的
$get("result").innerHTML += "Timed Out:" + error.get_timedOut() + "<br />";
var jsonContext =
Name: "webabcd",
Age: 27
};
</asp:Content>
運作結果
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
<%@ WebService Language="C#" Class="Sample" %>
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<Person> GetList()
List<Person> list = new List<Person>();
for (int i = 0; i < 10; i++)
Person p = new Person(i.ToString().PadLeft(4, '0'), i + 20);
list.Add(p);
return list;
public string SetList(List<Person> list)
StringBuilder sb = new StringBuilder();
sb.Append("<table border='1'>");
foreach (Person p in list)
sb.Append("<tr>");
sb.Append("<td>Name:" + p.Name + "</td>");
sb.Append("<td>Age:" + p.Age + "</td>");
sb.Append("</tr>");
sb.Append("</table>");
return sb.ToString();
public Dictionary<string, Person> GetDictionary()
Dictionary<string, Person> dictionary = new Dictionary<string, Person>();
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<Person> GetXml()
return GetList();
Sample.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" Title="WebService(簡單類型和複雜對象、JSON和XML)" %>
<asp:ServiceReference Path="Sample.asmx" />
<input type="button" id="btnSimpleTypeTest" value="SimpleTypeTest" />
<input type="button" id="btnGetPerson" value="GetPerson" />
<input type="button" id="btnSetPerson" value="SetPerson" />
<input type="button" id="btnGetList" value="GetList" />
<input type="button" id="btnSetList" value="SetList" />
<input type="button" id="btnGetDictionary" value="GetDictionary" />
<input type="button" id="btnGetDataTable" value="GetDataTable" />
<input type="button" id="btnGetXml" value="GetXml" />
<script type="Text/javascript">
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}<br />", 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("<table border='1'>");
for (var i=0; i<result.length; i++)
{
sb.append("<tr>");
sb.append("<td>Name:" + result[i].Name + "</td>");
sb.append("<td>Age:" + result[i].Age + "</td>");
sb.append("</tr>");
}
sb.append("</table>");
$get("result").innerHTML = sb.toString();
function btnSetList_click()
var ary = new Array();
for (var i = 0 ; i < 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("<td>Name:" + p.Name + "</td>");
sb.append("<td>Age:" + p.Age + "</td>");
function btnGetDataTable_click()
Sample.GetDataTable(onGetDataTableSucceeded);
function onGetDataTableSucceeded(result)
for (var i=0; i<result.rows.length; i++)
sb.append("<td>Name:" + result.rows[i].Name + "</td>");
sb.append("<td>Age:" + result.rows[i].Age + "</td>");
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”按鈕
<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Person><Name>0000</Name><Age>20</Age></Person>
<Person><Name>0001</Name><Age>21</Age></Person>
<Person><Name>0002</Name><Age>22</Age></Person>
<Person><Name>0003</Name><Age>23</Age></Person>
<Person><Name>0004</Name><Age>24</Age></Person>
<Person><Name>0005</Name><Age>25</Age></Person>
<Person><Name>0006</Name><Age>26</Age></Person>
<Person><Name>0007</Name><Age>27</Age></Person>
<Person><Name>0008</Name><Age>28</Age></Person>
<Person><Name>0009</Name><Age>29</Age></Person>
</ArrayOfPerson>
GeneratedProxy.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" Title="Generated Proxy Classes" %>
<p>
調用Web Service
<br />
var myServiceProxy = MyNameSpace.MyService();
myServiceProxy.MyServiceMethod(param1, param2, , succeededCallback, failedCallback,
userContext);
</p>
<ul>
<li>param - 在前面順序地寫參數 </li>
<li>succeededCallback - 調用成功的回調函數 </li>
<li>failedCallback - 調用失敗的回調函數 </li>
<li>userContext - 調用成功的回調函數 </li>
</ul>
調用成功的回調函數
function succeededCallback(result, userContext, methodName) { }
<li>result - 調用WebService的方法後傳回的資料 </li>
<li>userContext - 使用者上下文 </li>
<li>methodName - 調用的方法名 </li>
調用失敗的回調函數
function failedCallback(error, userContext, methodName) { }
<li>error - 調用WebService的方法後傳回的資料(Sys.Net.WebServiceError對象) </li>
<input type="text" id="txtName" value="webabcd" />
<input type="button" id="btnHello" value="Hello" />
// 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 + "<br />";
$get("result").innerHTML += "調用的方法名:" + methodName + "<br />";
$get("result").innerHTML = error.get_message() + "<br />";
1、頁面加載
彈出框,資訊:/Web/WebService/Hello.asmx
彈出框,資訊:0
2、單擊“Hello”按鈕
預設的Context:webabcd
調用的方法名:Say
WebServiceProxy.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" Title="WebServiceProxy Class" %>
var webRequest = Sys.Net.WebServiceProxy.invoke(path, methodName, useHttpGet, parameters,
succeededCallback, failedCallback, userContext, timeout);
<li>path - WebService的url </li>
<li>useHttpGet - 是否使用HTTP GET方式 </li>
<li>parameters - 參數(示例:{"param1":196610, "param2":"Hello"}) </li>
<li>timeout - 逾時時間 </li>
<li>傳回值 - 相關的WebRequest對象 </li>
<input type="button" id="btnHello" value="Hello" />
<br />
function btnHello_
var wRequest =
Sys.Net.WebServiceProxy.invoke
(
"Hello.asmx",
"Say",
false,
{"name":'webabcd'},
onSucceeded,
null,
-1
);
$get("result").innerHTML = wRequest.get_body() + "<br />";
function onSucceeded(result)
$get("result").innerHTML += result + "<br />";
1、單擊“Hello”按鈕
{"name":"webabcd"}
本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344812,如需轉載請自行聯系原作者