SQL Server[翻译]ASP.NET AJAX调用Web Service

初稿地址:http://www.developer.com/net/asp/article.php/3657826
[原稿源码下载]

ASP.NET AJAX调用Web Service

初稿发布日期:2007.02.08
作者:Bipin Joshi
翻译:webabcd

介绍
尽管AJAX是种植客户端技术,但事实上的开过程,它经常要调用一个服务器端的经过。通常,网站及之数码是存于一个提到项目数据库中,为了为AJAX更产生因此处,处理服务器端数据要一致栽简单可靠的道。幸运的凡,ASP.NET
AJAX提供了千篇一律栽中之基础架构来举行就宗工作,浏览器与服务器在Internet上足展开AJAX通信。自然而然,Web
Service在数额传和客户端/服务器之间的相似通信方面可扮一个主要角色。本文就演示了若经过ASP.NET
AJAX调用ASP.NET web services。

软件需要
本文所有的范例都是动ASP.NET AJAX RC版,而且,要于SQL Server 2005
(Express版即可)上发出一个Northwind数据库。范例以Visual Studio
2005看成开条件。

范例场景
范例开发了一个Web页面,用于输入Northwind数据库职员表中的老干部数据。页面通过ASP.NET
AJAX功能,调用一个Web Service来形成职员表中的数据增、删、改、查。

创造一个Web Service
用作开头,使用Visual Studio 2005创一个新的Web站点,注意将ASP.NET
AJAX项目模板上加到新站点对话框,这个对话框包括一个”ASP.NET AJAX Enabled
Web Site” 模板。
SQL Server 1
希冀1:新站点创建模板

利用”ASP.NET AJAX Enabled Web Site”
模板创建的初站点及用寻常方法创建的站点区别如下:
    ·它的Web.config自动包括过多ASP.NET AJAX专用的布局信息。
    ·System.Web.Extensions程序集让补加至引用中。

理所当然,我们可改变一个普通的Web站点,以使之切AJAX要求,但模板可以大大简化我们的办事。

今昔咱们创建了一个新的Web站点,添加一个初的web
service并取名也EmployeeService.asmx,EmployeeService将连5只Web方法

Method Name Description
GetEmployees() 返回Employees表里的雇员列表。 这个列表是一个Employee对象数组
GetEmployee() 接收EmployeeID参数返回Employee对象的详细信息
Insert() 给Employees表里增加一个新的雇员信息
Update() 更新Employees表里的某个雇员信息
Delete() 删除Employees表里的某个雇员信息

表1:EmployeeService中的Web方法

GetEmployees() 和
GetEmployee()方法为Employee对象的款式返回数据,因此,首先创建一个Employee类。右键单击App_Code文件夹,选择“添加新项…”,添加一个叫Employee的近乎,下面显示Employee类的百分之百代码:

SQL Server 2public class Employee
SQL Server 3SQL Server 4SQL Server 5{
SQL Server 6   private int intEmployeeID;
SQL Server 7   private string strFirstName;
SQL Server 8   private string strLastName;
SQL Server 9   public int EmployeeID
SQL Server 10SQL Server 11   SQL Server 12{
SQL Server 13      get
SQL Server 14SQL Server 15      SQL Server 16{
SQL Server 17         return intEmployeeID;
SQL Server 18      }
SQL Server 19      set
SQL Server 20SQL Server 21      SQL Server 22{
SQL Server 23         intEmployeeID = value;
SQL Server 24      }
SQL Server 25   }
SQL Server 26   public string FirstName
SQL Server 27SQL Server 28   SQL Server 29{
SQL Server 30      get
SQL Server 31SQL Server 32      SQL Server 33{
SQL Server 34         return strFirstName;
SQL Server 35      }
SQL Server 36      set
SQL Server 37SQL Server 38      SQL Server 39{
SQL Server 40         strFirstName = value;
SQL Server 41      }
SQL Server 42   }
SQL Server 43   public string LastName
SQL Server 44SQL Server 45   SQL Server 46{
SQL Server 47      get
SQL Server 48SQL Server 49      SQL Server 50{
SQL Server 51         return strLastName;
SQL Server 52      }
SQL Server 53      set
SQL Server 54SQL Server 55      SQL Server 56{
SQL Server 57         strLastName = value;
SQL Server 58      }
SQL Server 59   }
SQL Server 60}

Employee类申明三独Private变量来分别存放employee ID, first name和 last
name,三单变量再封闭装于三只public属性中:EmployeeID,
FirstName和LastName。

开辟 web.config文件,添加<connectionStrings>部分如下:

SQL Server 61<connectionStrings>
SQL Server 62   <add name=”connstr” connectionString=
SQL Server 63        “data source=.\sqlexpress;
SQL Server 64        initial catalog=northwind;
SQL Server 65        integrated security=true”/>
SQL Server 66</connectionStrings>

即部分存放数据库链接字符串,用于对Northwind数据库,确保修改SqlServer名称、IP地址和说明办法以和我们的出条件入。

而今,打开EmployeeService.cs添加如下代码:

SQL Server 67private string strConn =   “”;
SQL Server 68public EmployeeService()
SQL Server 69SQL Server 70SQL Server 71{
SQL Server 72   strConn = ConfigurationManager.ConnectionStrings[“connstr”].
SQL Server 73             ConnectionString;
SQL Server 74}

代码用了ConfigurationManager类来读取配置文件被的多少库链接字符串,并存放于一个看似级别的变量strConn中,这个变量将为下的所有Web
Method所使用。

现在,添加GetEmployees() web method:

SQL Server 75[WebMethod]
SQL Server 76public Employee[] GetEmployees()
SQL Server 77SQL Server 78SQL Server 79{
SQL Server 80   SqlConnection cnn = new SqlConnection(strConn);
SQL Server 81   cnn.Open();
SQL Server 82   SqlCommand cmd            = new SqlCommand();
SQL Server 83   cmd.Connection            = cnn;
SQL Server 84   cmd.CommandText           = “select employeeid,firstname,
SQL Server 85                                lastname from employees”;
SQL Server 86   SqlDataReader reader      = cmd.ExecuteReader();
SQL Server 87   List<Employee> list = new List<Employee>();
SQL Server 88   while (reader.Read())
SQL Server 89SQL Server 90   SQL Server 91{
SQL Server 92      Employee emp   = new Employee();
SQL Server 93      emp.EmployeeID = reader.GetInt32(0);
SQL Server 94      emp.FirstName  = reader.GetString(1);
SQL Server 95      emp.LastName   = reader.GetString(2);
SQL Server 96      list.Add(emp);
SQL Server 97   }
SQL Server 98   reader.Close();
SQL Server 99   cnn.Close();
SQL Server 100   return list.ToArray();
SQL Server 101}

代码创建了SqlConnection and SqlCommand
对象,然后实施SELECT查询,以获Employees表中EmployeeID, FirstName
和LastName字段。结果经SqlDataReader返回。然后,创建一个generic-based
Employee数组,通过While循环,给每个Employee实例的特性赋值。当While循环完毕的上,关闭SqlDataReader

SqlConnection。GetEmployees()方法返回的类型是Employee数组。因此,generic
List使用List类中的ToArray()方法来转换成Employee数组。

而今,添加一个GetEmployee() web method如下:

SQL Server 102[WebMethod]
SQL Server 103public Employee GetEmployee(int pEmployeeId)
SQL Server 104SQL Server 105SQL Server 106{
SQL Server 107   SqlConnection cnn = new SqlConnection(strConn);
SQL Server 108   cnn.Open();
SQL Server 109   SqlCommand cmd       = new SqlCommand();
SQL Server 110   cmd.Connection       = cnn;
SQL Server 111   cmd.CommandText      = “select employeeid,firstname,lastname
SQL Server 112                           from employees where employeeid=@id”;
SQL Server 113   SqlParameter id      = new SqlParameter(“@id”, pEmployeeId);
SQL Server 114   cmd.Parameters.Add(id);
SQL Server 115   SqlDataReader reader = cmd.ExecuteReader();
SQL Server 116   Employee emp         = new Employee();
SQL Server 117   while (reader.Read())
SQL Server 118SQL Server 119   SQL Server 120{
SQL Server 121      emp.EmployeeID = reader.GetInt32(0);
SQL Server 122      emp.FirstName  = reader.GetString(1);
SQL Server 123      emp.LastName   = reader.GetString(2);
SQL Server 124   }
SQL Server 125   reader.Close();
SQL Server 126   cnn.Close();
SQL Server 127   return emp;
SQL Server 128}

GetEmployee() web method接受一个employee
ID参数作为输入,代码和前的好相似,但这次就回一个employee。注意,使用SqlParameter来定义传入的EmployeeID。

而今,再补充加Insert()、Update()和 Delete()web methods,其中,Insert() web
method 以要增长的Employee的 first name 和 last name 作为参数,Update()
web method 以使更新的employee ID 以及新的first name 和 last
name作为参数,并尽UPDATE语句, Delete() web method 以使去除的employee
ID 作为参数,然后实施DELETE 语句

SQL Server 129[WebMethod]
SQL Server 130public int Insert(string pFirstName, string pLastName)
SQL Server 131SQL Server 132SQL Server 133{
SQL Server 134   SqlConnection cnn  = new SqlConnection(strConn);
SQL Server 135   cnn.Open();
SQL Server 136   SqlCommand cmd     = new SqlCommand();
SQL Server 137   cmd.Connection     = cnn;
SQL Server 138   cmd.CommandText    = “insert into employees(firstname,lastname)
SQL Server 139                         values (@fname,@lname)”;
SQL Server 140   SqlParameter fname = new SqlParameter(“@fname”, pFirstName);
SQL Server 141   SqlParameter lname = new SqlParameter(“@lname”, pLastName);
SQL Server 142   cmd.Parameters.Add(fname);
SQL Server 143   cmd.Parameters.Add(lname);
SQL Server 144   int i = cmd.ExecuteNonQuery();
SQL Server 145   cnn.Close();
SQL Server 146   return i;
SQL Server 147}
SQL Server 148[WebMethod]
SQL Server 149public int Update(int pEmployeeId,string pFirstName, string pLastName)
SQL Server 150SQL Server 151SQL Server 152{
SQL Server 153   SqlConnection cnn  = new SqlConnection(strConn);
SQL Server 154   cnn.Open();
SQL Server 155   SqlCommand cmd     = new SqlCommand();
SQL Server 156   cmd.Connection     = cnn;
SQL Server 157   cmd.CommandText    = “update employees set firstname=@fname,
SQL Server 158                         lastname=@lname where employeeid=@id”;
SQL Server 159   SqlParameter fname = new SqlParameter(“@fname”, pFirstName);
SQL Server 160   SqlParameter lname = new SqlParameter(“@lname”, pLastName);
SQL Server 161   SqlParameter id = new SqlParameter(“@id”, pEmployeeId);
SQL Server 162   cmd.Parameters.Add(fname);
SQL Server 163   cmd.Parameters.Add(lname);
SQL Server 164   cmd.Parameters.Add(id);
SQL Server 165   int i = cmd.ExecuteNonQuery();
SQL Server 166   cnn.Close();
SQL Server 167   return i;
SQL Server 168}
SQL Server 169[WebMethod]
SQL Server 170public int Delete(int pEmployeeId)
SQL Server 171SQL Server 172SQL Server 173{
SQL Server 174   SqlConnection cnn = new SqlConnection(strConn);
SQL Server 175   cnn.Open();
SQL Server 176   SqlCommand cmd  = new SqlCommand();
SQL Server 177   cmd.Connection  = cnn;
SQL Server 178   cmd.CommandText = “delete from employees where employeeid=@id”;
SQL Server 179   SqlParameter id = new SqlParameter(“@id”, pEmployeeId);
SQL Server 180   cmd.Parameters.Add(id);
SQL Server 181   int i = cmd.ExecuteNonQuery();
SQL Server 182   cnn.Close();
SQL Server 183   return i;
SQL Server 184}

当即虽做到了web
service的创立。到目前为止,还没有做另外和AJAX特性相关的其余工作,现在,时机已经成熟,我们透过下面的代码更改web
service类的定义:

SQL Server 185using System.Web.Script.Services;
SQL Server 186SQL Server 187
SQL Server 188SQL Server 189
SQL Server 190[WebService(Namespace = “http://tempuri.org/")\]
SQL Server 191[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
SQL Server 192[ScriptService]
SQL Server 193public class EmployeeService : System.Web.Services.WebService
SQL Server 194SQL Server 195SQL Server 196{
SQL Server 197   SQL Server 198
SQL Server 199   SQL Server 200

只顾特地标明的黑体字,我们导入了System.Web.Script.Services命名空间,这个命名空间来System.Web.Extensions程序集,这个命名空间供了[ScriptService]性,这将使web
service可以给来客户端的JavaScript (如ASP.NET AJAX)调用。

好了,我们初步准备从ASP.NET AJAX调用Web Service了!

怎么调用Web Service
旋即一部分,我们用创造一个Web页面作为数据输入,通过调用刚刚创建的Web
Service来操作Employees表。作为初始,我们先补加一个EmployeeServiceClient.aspx页面,打开工具箱,选择View
> Toolbox菜单,在工具箱上,选中AJAX Extensions这样的节点(见图2)
SQL Server 201
图 2: 增加模板后的新站点创建对话框

AJAX Extensions部分显得一个Web页面上享有可以使的ASP.NET
AJAX组件。所有以ASP.NET
AJAX的页面还得一个ScriptManager组件。打开ScriptManager属性窗口,定位Services属性,打开Service引用编辑器,如图3:
SQL Server 202
贪图 3: Service 引用编辑器

点击对话框底部的Add按钮,设置Path属性以对Web
Service(EmployeeService.asmx)的虚构路径,下面的号将见面出在Web页面文件中:

SQL Server 203<asp:ScriptManager ID=”ScriptManager1″ runat=”server” >
SQL Server 204   <Services>
SQL Server 205      <asp:ServiceReference Path=”EmployeeService.asmx” />
SQL Server 206   </Services>
SQL Server 207</asp:ScriptManager>

本着每个Web
Service调用,都需要在<asp:ScriptManager>部分添加一个<asp:ServiceReference>元素,此号把要运用的web
service注册到即web form上。
SQL Server 208
贪图 4: 设计页面表单

表单包括一个下拉框(<SELECT>) ,用于展示有的employee
IDs,一旦当选其中一个employee
ID,employee的详细信息将展示在2独文本框中,然后可以创新这些信息。如果如补充加一个employee,只待输入first
name 和 last
name,然后点击“插入”按钮就得了。同理,如果假定刨除一个employee,选择下拉框中之employee
ID,点击“删除”按钮。在INSERT、UPDATE或者
DELETE操作就后,将见面展示成功还是失败的音信。下面是有所的页面代码:

SQL Server 209<table>
SQL Server 210   <tr>
SQL Server 211      <td colspan=”2″>
SQL Server 212         <asp:Label ID=”Label4″ runat=”server” Font-Size=”X-Large”
SQL Server 213                    Text=”Employee Management”>
SQL Server 214         </asp:Label></td>
SQL Server 215   </tr>
SQL Server 216   <tr>
SQL Server 217      <td style=”width: 100px”>
SQL Server 218         <asp:Label ID=”Label1″ runat=”server”
SQL Server 219                    Text=”Employee ID :”></asp:Label></td>
SQL Server 220      <td style=”width: 100px”>
SQL Server 221         <select id=”Select1″ >
SQL Server 222         </select>
SQL Server 223      </td>
SQL Server 224   </tr>
SQL Server 225   <tr>
SQL Server 226      <td style=”width: 100px”>
SQL Server 227         <asp:Label ID=”Label2″ runat=”server”
SQL Server 228                    Text=”First Name :”></asp:Label></td>
SQL Server 229      <td style=”width: 100px”>
SQL Server 230         <input id=”Text1″ type=”text” /></td>
SQL Server 231   </tr>
SQL Server 232   <tr>
SQL Server 233      <td style=”width: 100px”>
SQL Server 234         <asp:Label ID=”Label3″ runat=”server”
SQL Server 235                    Text=”Last Name :”></asp:Label></td>
SQL Server 236      <td style=”width: 100px”>
SQL Server 237         <input id=”Text2″ type=”text” /></td>
SQL Server 238   </tr>
SQL Server 239   <tr>
SQL Server 240      <td align=”center” colspan=”2″>
SQL Server 241         <input id=”Button3″ type=”button” value=”Insert” />
SQL Server 242         <input id=”Button4″ type=”button” value=”Update” />
SQL Server 243         <input id=”Button5″ type=”button” value=”Delete” />
SQL Server 244      </td>
SQL Server 245   </tr>
SQL Server 246   <tr>
SQL Server 247      <td align=”center” colspan=”2″>
SQL Server 248         <span id=”lblMsg” style=”font-weight: bold;
SQL Server 249               color: red;”></span>
SQL Server 250      </td>
SQL Server 251   </tr>
SQL Server 252</table>

只顾:我们没行使ASP.NET服务器端控件,如DropDownList、 TextBox 以及
Button。取而代之的凡,我们因而的风俗习惯的HTML控件,如:<SELECT> 以及
<INPUT>。这为我们如果想经过客户端JavaScript调用web
service,而未是透过服务端代码。同理,注意底下的<SPAN>标记,这是为此来显示成功或者失败的音讯之。

下同样步,在<head>元素外多一个<script>部分,添加一个CallWebMethod()的函数:

SQL Server 253function CallWebMethod(methodType)
SQL Server 254SQL Server 255SQL Server 256{
SQL Server 257   switch(methodType)
SQL Server 258SQL Server 259   SQL Server 260{
SQL Server 261      case “select”:
SQL Server 262         EmployeeService.GetEmployees(FillEmployeeList,ErrorHandler,
SQL Server 263                                      TimeOutHandler);
SQL Server 264         break;
SQL Server 265      case “selectone”:
SQL Server 266         var select=document.getElementById(“Select1”);
SQL Server 267         var empid=select.options[select.selectedIndex].value;
SQL Server 268         EmployeeService.GetEmployee(empid,DisplayEmployeeDetails,
SQL Server 269                                     ErrorHandler,TimeOutHandler);
SQL Server 270         break;
SQL Server 271      case “insert”:
SQL Server 272         var text1=document.getElementById(“Text1”);
SQL Server 273         var text2=document.getElementById(“Text2”);
SQL Server 274         EmployeeService.Insert(text1.value,text2.value,
SQL Server 275                                InsertEmployee,ErrorHandler,
SQL Server 276                                TimeOutHandler);
SQL Server 277         break;
SQL Server 278      case “update”:
SQL Server 279         var select=document.getElementById(“Select1”);
SQL Server 280         var empid=select.options[select.selectedIndex].value;
SQL Server 281         var text1=document.getElementById(“Text1”);
SQL Server 282         var text2=document.getElementById(“Text2”);
SQL Server 283         var emp=new Employee();
SQL Server 284         emp.EmployeeID=empid;
SQL Server 285         emp.FirstName=text1.value;
SQL Server 286         emp.LastName=text2.value;
SQL Server 287         EmployeeService.Update(empid,text1.value,text2.value,
SQL Server 288                                UpdateEmployee,ErrorHandler,
SQL Server 289                                TimeOutHandler);
SQL Server 290         break;
SQL Server 291      case “delete”:
SQL Server 292         var select=document.getElementById(“Select1”);
SQL Server 293         var empid=select.options[select.selectedIndex].value;
SQL Server 294         EmployeeService.Delete(empid,DeleteEmployee,ErrorHandler,
SQL Server 295                                TimeOutHandler);
SQL Server 296         break;
SQL Server 297   }
SQL Server 298}

CallWebMethod() 函数 就是之所以来调用web service的中央决定函数。
这个函数接收一个字符串参数用来标识调用的方式,它包括一个switch
语词来判定调用的法子,每个 case 块 调用一个web method。 注意web method
是安吃调用的:ASP.NET AJAX 框架自动创建一个JavaScript
代理类,这个代理类和如调用的web service有同之名目。因此,上面代码中
EmployeeService 并无是的确的 类,而是一个JavaScript 代理类。
代理类包括原始web service中装有的Web Method。除了原的web method
所概括的参数外,每个方法还连3只附加的参数。

率先独参数是一个JavaScript 函数,用于当web method
成功就时调用的。记住:所有客户端以及劳务器端的AJAX
通信都是异步的,因此,这个函数用来捕获web method
的归值。第二独参数是用来产生误的情状下调用的JavaScript
函数。最后,第三只参数是当调用Web Service
发生过的景下调用之JavaScript 函数。

首先栽状态,case (“select”),就是简的调用GetEmployees()
方法;第二栽情形,case
(“selectone”),调用GetEmployee()方法,通过传统的JavaScript
代码获取下拉框中的employee
ID;同理,第三、第四、第五单Case依次调用Insert()、 Update()和
Delete()方法。

地方的代码通过5独JavaScript函数实现相应的web method
成功调用:FillEmployeeList(), DisplayEmployeeDetails(),
InsertEmployee(), UpdateEmployee()以及
DeleteEmployee()。每个函数接收一个参数作为web method相应的归值。

SQL Server 299function FillEmployeeList(result)
SQL Server 300SQL Server 301SQL Server 302{
SQL Server 303   var select=document.getElementById(“Select1”);
SQL Server 304   for(var i=0;i<result.length;i++)
SQL Server 305SQL Server 306   SQL Server 307{
SQL Server 308      var option=new Option(result[i].EmployeeID,
SQL Server 309                            result[i].EmployeeID);
SQL Server 310      select.options.add(option);
SQL Server 311   }
SQL Server 312}
SQL Server 313function DisplayEmployeeDetails(result)
SQL Server 314SQL Server 315SQL Server 316{
SQL Server 317   var text1=document.getElementById(“Text1”);
SQL Server 318   var text2=document.getElementById(“Text2”);
SQL Server 319   text1.innerText=result.FirstName;
SQL Server 320   text2.innerText=result.LastName;
SQL Server 321   var lblMsg=document.getElementById(“lblMsg”);
SQL Server 322   lblMsg.innerText=””;
SQL Server 323}
SQL Server 324function InsertEmployee(result)
SQL Server 325SQL Server 326SQL Server 327{
SQL Server 328   if(result>0)
SQL Server 329SQL Server 330   SQL Server 331{
SQL Server 332      var lblMsg=document.getElementById(“lblMsg”);
SQL Server 333      lblMsg.innerText=”Employee added successfully!”;
SQL Server 334   }
SQL Server 335   else
SQL Server 336SQL Server 337   SQL Server 338{
SQL Server 339      var lblMsg=document.getElementById(“lblMsg”);
SQL Server 340      lblMsg.innerText=”Error occurred while adding new employee!”;
SQL Server 341   }
SQL Server 342}
SQL Server 343function UpdateEmployee(result)
SQL Server 344SQL Server 345SQL Server 346{
SQL Server 347   if(result>0)
SQL Server 348SQL Server 349   SQL Server 350{
SQL Server 351      var lblMsg=document.getElementById(“lblMsg”);
SQL Server 352      lblMsg.innerText=”Employee updated successfully!”;
SQL Server 353   }
SQL Server 354   else
SQL Server 355SQL Server 356   SQL Server 357{
SQL Server 358      var lblMsg=document.getElementById(“lblMsg”);
SQL Server 359      lblMsg.innerText=”Error occurred while updating the employee!”;
SQL Server 360   }
SQL Server 361}
SQL Server 362function DeleteEmployee(result)
SQL Server 363SQL Server 364SQL Server 365{
SQL Server 366   if(result>0)
SQL Server 367SQL Server 368   SQL Server 369{
SQL Server 370      var lblMsg=document.getElementById(“lblMsg”);
SQL Server 371      lblMsg.innerText=”Employee deleted successfully!”;
SQL Server 372   }
SQL Server 373   else
SQL Server 374SQL Server 375   SQL Server 376{
SQL Server 377      var lblMsg=document.getElementById(“lblMsg”);
SQL Server 378      lblMsg.innerText=”Error occurred while deleting employee!”;
SQL Server 379   }
SQL Server 380}

FillEmployeeList()
函数以Employee对象数组作为输入参数,还记GetEmployees() web method
返回的Employee对象往往组吧。然后对这个数组迭代处理,在历次迭代中,一个初的OPTION元素被创造并上加至下拉框中。DisplayEmployeeDetails()函数以一个Employee对象作为输入,这个Employee对象包括了一个Employee的详细信息,并出示在2单文本框中。InsertEmployee(),
UpdateEmployee()和DeleteEmployee()函数以一个整型的数值标明INSERT,
UPDATE和DELETE操作所影响之记录数,一个大于0底数值标明操作成,并以<SPAN>标记内显示一个成的信息;否则,显示一个错误信息。当页面第一差加载时,需要为此现有的employee
ID给下拉框赋值,这得经过调用一个特定的名吧pageLoad()的函数中贯彻:

SQL Server 381function pageLoad()
SQL Server 382SQL Server 383SQL Server 384{
SQL Server 385   CallWebMethod(“select”);
SQL Server 386}
SQL Server 387

pageLoad()函数在客户端浏览器页面加载时自动调用,最后,错误处理(error
handler)和过期处理(timeout handler)函数如下:

SQL Server 388function ErrorHandler(result)
SQL Server 389SQL Server 390SQL Server 391{
SQL Server 392   var msg=result.get_exceptionType() + “\r\n”;
SQL Server 393   msg += result.get_message() + “\r\n”;
SQL Server 394   msg += result.get_stackTrace();
SQL Server 395   alert(msg);
SQL Server 396}
SQL Server 397function TimeOutHandler(result)
SQL Server 398SQL Server 399SQL Server 400{
SQL Server 401   alert(“Timeout :” + result);
SQL Server 402}

TimeOutHandler() 函数在旁web method
调用有过的景况下调用。它就显示了一个Alert给用户。 ErrorHandler()
函数在出错误产生的气象下调用,其输入result
参数提供了3只法子:get_exceptionType()、get_message()以及
get_stackTrace()。这三单主意分别返回异常类型(type of
exception)、详细错误信息 和堆栈跟踪(stack
trace)。这里ErrorHandler()函数也仅仅显示了一个alert给终端用户。

测试网页
如今,我们已经落实了web
service和客户端应用程序。测试一下吧!运行网页,试着增加、更新、删除一个employee看看,图5显示更新一个employee后的效用:
SQL Server 403
图 5: 更新Employee后的页面效果

只要想测试错误处理函数,把初始化数据库链接字符串改化一个空值,然后运行网页看看,这次,就会来得一个警报(alert),如图6:
SQL Server 404
希冀 6: 链接字符串错误报警

调用外部Web Services
本条例子中,EmployeeService也是Web站点的一模一样片。有时候,我们的先后也许得调用根本就是从来不安排在我们的地方的web
services。 ASP.NET AJAX内部用依赖XML HTTP
对象,而由安全由,是未可知跟布置在另表面站点进行通信的。这便代表地方所说之技能对表面的web
services调用无效。不幸之是,ASP.NET
AJAX关于此题材尚从未一直的化解方案(至少在RC版本)。然而,微软披露了一个照当CTP阶段的“Bridge”技术,我们可以以这个技来调用一个配置于地方的包装(Wrapper)的好像,然后以是近乎吃来调用外部的实在的Web
Service。在时底RC版本中,我们得以咱们的Web Site中开创一个Wrapper Web
Service,以她来调用最初的Web Service。然后于客户端程序中经过调用Wrapper
Web Service实现通信。下面显示必要之步调:
1. 每当web站点中上加一个web引用,指向外部的Web service;
2. 创建一个当地Web service;
3. 每当初创的Web service中,提供包装的web method,这些点子调用外部的Web
Method;
4. 就此本文中所说的方法以客户端应用程序中调用本地新长的web Service。

调用ASP.NET Web Services的基础架构
ASP.NET AJAX提供了总体的架构以由客户端JavaScript调用ASP.NET web
services。我们好轻松地用AJAX把劳动器端数据集成进用户应的Web页面中。而我们所用举行的就是单独用[ScriptService]性来标识web
Service。ASP.NET AJAX 框架会呢咱的web
service自动生成JavaScript代理,然后经运用代理来调用web methods。

下载源码
[原稿源码下载]

作者:Bipin Joshi
Email:http://www.dotnetbips.com/contact.aspx
简介:Bipin
Joshi是DotNetBips.com的领队。他是http://www.binaryintellect.com/的倡导者,这个企业提供.NET
framwork的培育暨提问服务。他以印度孟采购吧开发者提供培训。他呢是微软的MVP(ASP.Net)和ASPInsiders的会员。

翻译注:原文中之document.getElementById可以据此$get来代替

相关文章