现在的位置: 首页 > 综合 > 正文

新瓶旧酒ASP.NET AJAX(9) – 客户端脚本编程(Sys.Net命名空间下的WebServiceProxy、WebServiceError、Generated Proxy Classes以及调用WebService、PageMethod)

2011年05月12日 ⁄ 综合 ⁄ 共 7898字 ⁄ 字号 评论关闭
[索引页]
[源码下载]

新瓶旧酒ASP.NET AJAX(9) - 客户端脚本编程(Sys.Net命名空间下的WebServiceProxy、WebServiceError、Generated Proxy Classes以及调用WebService、PageMethod)

作者:webabcd

介绍
使用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的路径
    ·timeout - 超时时间

6、Generated Proxy Classes(调用Web Service)
    var myServiceProxy = MyNameSpace.MyService();
    myServiceProxy.MyServiceMethod(param1, param2, ..., succeededCallback, failedCallback, userContext);
    ·param - 在前面顺序地写参数
    ·succeededCallback - 调用成功的回调函数
    ·failedCallback - 调用失败的回调函数
    ·userContext - 调用成功的回调函数

7、Generated Proxy Classes(调用成功的回调函数)
    function succeededCallback(result, userContext, methodName) { }
    ·result - 调用WebService的方法后返回的数据
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

8、Generated Proxy Classes(调用失败的回调函数)
    function failedCallback(error, userContext, methodName) { }
    ·error - 调用WebService的方法后返回的数据(Sys.Net.WebServiceError对象)
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

示例
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);
    }


    [WebMethod]
    
// 如果用GET方式的话,[ScriptMethod(UseHttpGet = true)]
    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" onclick="btnHelloWebService_click()" />
    
<input type="button" id="btnHelloPageMethod" value="HelloPageMethod" onclick="btnHelloPageMethod_click()" />
    
<input type="button" id="btnContext" value="HelloContext" onclick="btnHelloContext_click()" />
    
<input type="button" id="btnHelloError" value="HelloError" onclick="btnHelloError_click()" />
    
<br /><br />
    
<div id="result" />

    
<script type="text/javascript">
        
function btnHelloWebService_click() 
        
{
            
var name = $get("txtName").value;
            Hello.Say(name, onSucceeded);
        }


        
function btnHelloPageMethod_click() 
        
{
            
var name = $get("txtName").value;
            PageMethods.Say(name, onSucceeded);
        }

        
        
function btnHelloContext_click() 
        
{
            
var name = $get("txtName").value;
            Hello.Say(name, onHelloContextSucceeded, 
null, jsonContext);
        }


        
function btnHelloError_click() 
        
{
            Hello.SayError(
1000, onSucceeded, onFailed);
        }


        
function onSucceeded(result) 
        
{
            $get(
"result").innerHTML = result + "<br />";
        }

        
        
function onHelloContextSucceeded(result, context) 
        
{
            $get(
"result").innerHTML = result + "<br />";
            
            $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
        }
;

    
</script>

</asp:Content>

运行结果
1、单击“HelloWebService”按钮
WebService Hello webabcd

2、单击“HelloPageMethod”按钮
PageMethod Hello webabcd

3、单击“HelloContext”按钮
WebService Hello webabcd
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;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using System.Collections.Generic;
using System.Text;
using System.Data;

[WebService(Namespace 
= "http://tempuri.org/")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
[GenerateScriptType(
typeof(Person))]
[ScriptService]
public class Sample : System.Web.Services.WebService
{
    [WebMethod]
    
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);
    }



    [WebMethod]
    
public

抱歉!评论已关闭.