• 转:Ajax调用Webservice和后台方法


    本次课程内容包括
        • 客户端访问WebService基础
        • 客户端访问PageMethod基础
        • 错误处理
        • 复杂数据类型使用基础
        • 客户端代理使用细节

    收听本次课程需具备的条件
        • 了解.NET Framework开发
        • 熟悉JavaScript开发(应知道怎么调用方法,回调函数的概念

    一、服务器端释放WebService方法
        • 编写一个普通的ASP.NET WebService
        • 为WebService类添加自定义属性标记
            – ScriptServiceAttribute
        • 释放WebService方法
            – 访问级别为public(首先基本public权限的方法
            – 使用WebMethodAttribute进行标记
        • 为页面中的ScriptManager(Proxy)引入asmx文件

    二、客户端访问WebService
        • [Namespaces.]ClassName.MethodName (命名空间 -> 类 -> 方法
        • 依次传入参数
        • 传入一个方法做为成功后的回调函数
        • 即使没有返回值也会调用回调函数(因为它只是通知你事件已经处理完毕)

    DEMO 1客户端访问WebService基础

    WebServiceFoundation.asmx

    <%@ WebService Language="C#" Class="Sample.WebServiceFoundation" %>

    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Web.Script.Services;

    namespace Sample
    {
        [WebService(Namespace 
    = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo 
    = WsiProfiles.BasicProfile1_1)]
        [ScriptService]   
    //要释放时此处必须标写
        public class WebServiceFoundation : System.Web.Services.WebService //继承WebService类
        
    {
            [WebMethod]
            
    public int GetRandom()
            
    {
                
    return new Random(DateTime.Now.Millisecond).Next();
            }


            [WebMethod]
            
    public int GetRangeRandom(int minValue, int maxValue)
            
    //在一个区间获得一个随机数
                
    return new Random(DateTime.Now.Millisecond).Next(minValue, maxValue);
            }

        }

    }

    1_WebServiceFoundation.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="1_WebServiceFoundation.aspx.cs" Inherits="_1_WebServiceFoundation" %>

    <!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">
        
    <title>Untitled Page</title>
    </head>
    <body>
        
    <form id="form1" runat="server">
            
    <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
                
    <Services>
                    
    <asp:ServiceReference Path="WebServiceFoundation.asmx" InlineScript="true" /> //InlineScript 默认为false
                </Services>
            
    </asp:ScriptManager>
            
            
    <input type="button" value="Get Random" onclick="getRandom()" />
            
    <input type="button" value="Get Range Random" onclick="getRandom(50, 100)" />
            
            
    <script language="javascript" type="text/javascript">
                function getRandom(minValue, maxValue)
                
    { //客户端提供一个类似重载的功能
                    
    if (arguments.length != 2)
                    
    {
                        Sample.WebServiceFoundation.GetRandom(getRandomSucceeded);
                    }

                    
    else
                    
    {
                        Sample.WebServiceFoundation.GetRangeRandom(minValue, maxValue, getRandomSucceeded);
                    }

                }

                
                function getRandomSucceeded(result)
                
    {
                    alert(result);
                }

            
    </script>
        
    </form>
    </body>
    </html>

    arguments:在JavaScript方法被调用时,都会初始化一个arguments这么一个对象,可当作一个数组类使用,但实际上是一个object,存放的就是这个方法调用时实际传入的参数

    三、客户端访问PageMethod
        • 服务器端
            – 只能在aspx页面中定义
            – 只能是公开静态方法(static,无法在方法中访问页面控件
            – 使用WebMethodAttribute标记
            – ScriptManager的EnablePageMethods属性设为true (EnablePageMethods默认为false
        • 客户端
            – 通过PageMethods.MethodName访问

    DEMO 2 客户端访问PageMethods基础

    2_PageMethods.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="2_PageMethods.aspx.cs" Inherits="_2_PageMethods" %>

    <!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">
        
    <title>Untitled Page</title>
    </head>
    <body>
        
    <form id="form1" runat="server">
            
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
            
            
    <input type="button" value="Get Current Time" onclick="getCurrentTime()" />
        
            
    <script language="javascript" type="text/javascript">
                function getCurrentTime()
                
    {
                    PageMethods.GetCurrentTime(getCurrentTimeSucceeded);
                }

                
                function getCurrentTimeSucceeded(result)
                
    {
                    alert(result);
                }

            
    </script>
        
    </form>
    </body>
    </html>

    2_PageMethods.aspx.cs 

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Web.Services;

    public partial class _2_PageMethods : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {

        }


        [WebMethod]
        
    public static DateTime GetCurrentTime()
        
    {
            
    return DateTime.UtcNow; //得到一个UTC时间
        }

    }

    运行结果:

    当点击button时将 弹出

     Mon May 14 15:11:57 UTC+0800 2007

    四、错误处理
        • 调用时可以提供一个额外的错误回调函数
        • 包括超时和服务器端抛出的异常
        • 超时只能设置在WebService级别
            – 或者设置在PageMethods对象上
            – 无法在每个Method Call时指定(只能在Page中设定
        • Sys.Net.WebServiceError (是个类)
            – timedout、message、exceptionType、stackTrace属性
    只有timeout为布尔型,其他都为字符型

     DEMO 3 错误处理

    ErrorHandling.asmx

    <%@ WebService Language="C#" Class="ErrorHandling" %>

    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Web.Script.Services;
    using System.Threading;

    [WebService(Namespace 
    = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo 
    = WsiProfiles.BasicProfile1_1)]
    [ScriptService]
    public class ErrorHandling  : System.Web.Services.WebService
    {
        [WebMethod]
        
    public int GetDivision(int a, int b)
        
    {
            
    return a / b;   //当a b为浮点数时,b为0时,不返回错误,而是返回一个无穷大的数
        }


        [WebMethod]
        
    public int Timeout()
        
    {
            Thread.Sleep(
    5000);
            
    return 0;
        }

    }


    3_ErrorHandling.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="3_ErrorHandling.aspx.cs" Inherits="_3_ErrorHandling" %>

    <!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">
        
    <title>Untitled Page</title>
    </head>
    <body>
        
    <form id="form1" runat="server">
            
    <asp:ScriptManager ID="ScriptManager1" runat="server">
                
    <Services>
                    
    <asp:ServiceReference Path="ErrorHandling.asmx" />
                
    </Services>
            
    </asp:ScriptManager>
            
            
    <input type="button" value="getDivision" onclick="getDivision(5, 0)" />
            
    <input type="button" value="timeout" onclick="timeout()" />
            
            
    <script language="javascript" type="text/javascript">
                function getDivision(a, b)
                
    {
                    ErrorHandling.GetDivision(a, b, 
    null, failedCallback);
                                                                                         
    //(a b)为传入的参数,null为正确运行以后回调处理的的方法名,此处为空,表示不处理。
                                                                                        
    //failedCallback为出错时处理的方法名
                }

                
                function timeout()
                
    {
                    ErrorHandling.set_timeout(
    2000); //当不设置超时时间时,将不作任何处理
                    ErrorHandling.Timeout(
    null, failedCallback);
                }

                
                function failedCallback(error)
                
    {
                    var message 
    = String.format(
                        
    "Timeout: {0} Message: {1} ExceptionType: {2} StackTrace: {3}",
                        error.get_timedOut(),
                        error.get_message(),
                        error.get_exceptionType(),
                        error.get_stackTrace());
                
                    alert(message);
                }

            
    </script>
        
    </form>
    </body>
    </html>

  • 相关阅读:
    kotlin类与对象——>对象表达式与对象声明、内联类
    kotlin类与对象——>嵌套类与内部类、枚举类
    kotlin类与对象——>数据类、密封类、泛型
    UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
    xcode 统计代码行数
    iOS 常用的一些公用方法
    如何在一个项目中去建立多个Target
    instrument linker 的使用
    25 优化技巧
    二维码生成与扫描
  • 原文地址:https://www.cnblogs.com/neekerss/p/1816644.html
Copyright © 2020-2023  润新知