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

ASP.NET AJAX调用Web Service

原来的书文发表日期:2006.02.08
作者:Bipin Joshi
翻译:webabcd

介绍
尽管AJAX是种客户端技术,但其实的成本进程,它平时要调用一个劳务器端的经过。平时,网站上的数码是存放在一个关系型数据库中,为了让AJAX更有用处,处理服务器端数据要求一种简单可信赖的法子。幸运的是,ASP.NET
AJAX提供了一种有效的基础架构来做那件工作,浏览器和服务器在Internet上能够展开AJAX通讯。任其自然,Web
Service在多少传输和客户端/服务器之间的相似通信方面可以扮演贰个关键角色。本文就演示了一旦经过ASP.NET
AJAX调用ASP.NET web services。

软件供给
本文全数的范例都是选拔ASP.NET AJAX 冠道C版,而且,要在SQL Server 2005(Express版即可)上有多少个Northwind数据库。范例使用Visual Studio
二〇〇五看作开发条件。

范例场景
范例开发了一个Web页面,用于输入Northwind数据库人士表中的老干数据。页面通过ASP.NET
AJAX效率,调用3个Web 瑟维斯来完结职员表中的数据增、删、改、查。

开创贰个Web 瑟维斯
作为起始,使用Visual Studio 2007开立五个新的Web站点,注意把ASP.NET
AJAX项目模板添加到新站点对话框,那个对话框包罗三个”ASP.NET AJAX Enabled
Web Site” 模板。
图片 1
图1:新站点创立模板

使用”ASP.NET AJAX Enabled Web Site”
模板创建的新站点和用普通方法创设的站点差距如下:
    ·它的Web.config自动包含过多ASP.NET AJAX专用的布局音信。
    ·System.Web.Extensions程序集被添加到引用中。

本来,大家得以变动2个常备的Web站点,以使之符合AJAX供给,但模板能够大大简化大家的行事。

明天咱们创设了一个新的Web站点,添加一个新的web
service并取名为EmployeeService.asmx,EmployeeService将囊括五个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类的一切代码:

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

Employee类注脚多少个Private变量来分别存放employee ID, first name和 last
name,多个变量再封装在多个public属性中:EmployeeID,
FirstName和LastName。

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

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

那有的存放数据库链接字符串,用于指向Northwind数据库,确定保障修改SqlServer名称、IP地址以及表达方式以和大家的支付环境相符。

前几日,打开EmployeeService.cs添加如下代码:

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

代码应用了ConfigurationManager类来读取配置文件中的数据库链接字符串,并存放在一个类级其余变量strConn中,那一个变量将被下边包车型大巴有着Web
Method所使用。

现在,添加GetEmployees() web method:

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

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

GetEmployee() web method接受3个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 语句

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

那就到位了web
service的创办。到近年来甘休,还尚无做任何和AJAX性格相关的任何工作,以后,时机已经成熟,大家通过上面包车型客车代码更改web
service类的概念:

图片 185using System.Web.Script.Services;
图片 186图片 187
图片 188图片 189
图片 190[WebService(Namespace = “http://tempuri.org/")\]
图片 191[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
图片 192[ScriptService]
图片 193public class EmployeeService : System.Web.Services.WebService
图片 194图片 195图片 196{
图片 197   图片 198
图片 199   图片 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表。作为开始,大家先添加1个EmployeeServiceClient.aspx页面,打开工具箱,选拔View
> Toolbox菜单,在工具箱上,选中AJAX Extensions那样的节点(见图2)
图片 201
图 2: 扩充模板后的新站点创制对话框

AJAX Extensions部分显得叁个Web页面上独具能够选取的ASP.NET
AJAX组件。全部应用ASP.NET
AJAX的页面都必要二个ScriptManager组件。打开ScriptManager属性窗口,定位Services属性,打开Service引用编辑器,如图3:
图片 202
图 3: Service 引用编辑器

点击对话框尾部的Add按钮,设置Path属性以指向Web
Service(EmployeeService.asmx)的虚拟路径,上面包车型客车标志将会发生在Web页面文件中:

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

对每种Web
Service调用,都亟需在<asp:ScriptManager>部分添加多少个<asp:ServiceReference>成分,此标志把要选取的web
service注册到当下web form上。
图片 208
图 4: 设计页面表单

表单包括八个下拉框(<SELECT>) ,用于显示全部的employee
IDs,一旦当选个中三个employee
ID,employee的详细音讯将显得在1个文本框中,然后可以立异那个新闻。如果要添加3个employee,只要求输入first
name 和 last
name,然后点击“插入”按钮就足以了。同理,假使要删减三个employee,选用下拉框中的employee
ID,点击“删除”按钮。在INSE奥迪Q7T、UPDATE或许DELETE操作实现后,将会展现成功或许退步的音讯。上边是怀有的页面代码:

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

注意:大家尚无应用ASP.NET服务器端控件,如DropDownList、 TextBox 以及
Button。取而代之的是,我们用的守旧的HTML控件,如:<SELECT> 以及
<INPUT>。那因为大家要想经过客户端JavaScript调用web
service,而不是经过服务端代码。同理,注意底下的<SPAN>标记,那是用来彰显成功依旧失利的音信的。

下一步,在<head>成分内扩展3个<script>部分,添加一个CallWebMethod()的函数:

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

CallWebMethod() 函数 正是用来调用web service的大旨决定函数。
这一个函数接收1个字符串参数用来标识调用的格局,它包括叁个switch
语句来判定调用的方法,每一种 case 块 调用1个web method。 注意web method
是何等被调用的:ASP.NET AJAX 框架自动成立3个JavaScript
代理类,这一个代理类和要调用的web service有同样的名号。因而,上边代码中
EmployeeService 并不是当真的 类,而是三个JavaScript 代理类。
代理类包罗原始web service中享有的Web Method。除了原来的web method
所总结的参数外,每一个方法还包涵一个附加的参数。

率先个参数是贰个JavaScript 函数,用于当web method
成功做到时调用的。记住:全部客户端和劳动器端的AJAX
通讯都以异步的,因而,那么些函数用来捕获web method
的再次来到值。第三个参数是用以发生错误的事态下调用的JavaScript
函数。最终,第两个参数是当调用Web Service发生超时的情况下调用的JavaScript 函数。

第贰种景况,case (“select”),正是简单的调用GetEmployees()
方法;第三种状态,case
(“selectone”),调用GetEmployee()方法,通过古板的JavaScript
代码获取下拉框中的employee
ID;同理,第2 、第四、第④个Case依次调用Insert()、 Update()和
Delete()方法。

地方的代码通过陆个JavaScript函数完成相应的web method
成功调用:FillEmployeeList(), DisplayEmployeeDetails(),
InsertEmployee(), UpdateEmployee()以及
DeleteEmployee()。每一个函数接收2个参数作为web method相应的重返值。

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

FillEmployeeList()
函数以Employee对象数组作为输入参数,还记得GetEmployees() web method
重返的Employee对象数组吧。然后对那个数组迭代处理,在历次迭代中,叁个新的OPTION元素被成立并添加到下拉框中。DisplayEmployeeDetails()函数以三个Employee对象作为输入,那些Employee对象包含了八个Employee的详细消息,并展现在叁个文本框中。InsertEmployee(),
UpdateEmployee()和DeleteEmployee()函数以二个整型的数值标明INSE哈弗T,
UPDATE和DELETE操作所影响的记录数,1个大于0的数值标明操作成功,并在<SPAN>标记内显示四个打响的消息;不然,显示三个错误音讯。当页面第3回加载时,供给用现有的employee
ID给下拉框赋值,那得经过调用三个一定的名为pageLoad()的函数中落到实处:

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

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

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

TimeOutHandler() 函数在其余web method
调用发生超时的景观下调用。它独自突显了3个Alert给用户。 ErrorHandler()
函数在有荒唐爆发的景况下调用,其输入result
参数提供了一个艺术:get_exceptionType()、get_message()以及
get_stackTrace()。那多少个办法分别重临分外类型(type of
exception)、详细错误消息 和储藏室跟踪(stack
trace)。那里ErrorHandler()函数也唯有显示了3个alert给终端用户。

测试网页
最近,我们早已达成了web
service和客户端应用程序。测试一下啊!运维网页,试着扩大、更新、删除七个employee看看,图5展现更新3个employee后的意义:
图片 403
图 5: 更新Employee后的页面效果

要想测试错误处理函数,把起首化数据库链接字符串改成3个空值,然后运营网页看看,这一次,就会显得一个警报(alert),如图6:
图片 404
图 6: 链接字符串错误报告警方

调用外部Web Services
其一例子中,EmployeeService也是Web站点的一有个别。有时候,大家的次序也许须要调用根本就不曾布署在我们的域的web
services。 ASP.NET AJAX内部需求正视XML HTTP
对象,而出于安全原因,是不能够和配置在任何表面站点进行通讯的。那就代表地点所说的技艺对外表的web
services调用无效。不幸的是,ASP.NET
AJAX关于此题材还尚未直接的消除方案(至少在RAV4C版本)。但是,微软发布了二个仍在CTP阶段的“Bridge”技术,我们得以接纳此技能来调用多个配置在该地的包装(Wrapper)的类,然后在那一个类中来调用外部的莫过于的Web
Service。在方今的TucsonC版本中,我们能够在大家的Web Site中创造3个Wrapper Web
Service,以它来调用最初的Web 瑟维斯。然后在客户端程序中通过调用Wrapper
Web Service实现通讯。上面呈现须求的步调:
1. 在web站点中添加一个web引用,指向外部的Web service;
2. 创建1个本地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来代表

相关文章

网站地图xml地图