技术开发 频道

用IE的Web服务建立ASP.NET应用程序

  

  接着把SqlDataAdapter对象的SelectCommand属性设置为前面建立的SqlCommand对象:
adapter.SelectCommand = command;
  
  现在使用Fill方法,通过在数据源上执行前面指定的SQL语句从数据源检索数据:
//用存储过程返回的值填充数据集 adapter.Fill(employeeDataset,"Employees" );
  
  一旦雇员信息成为数据集形式的,你就可以检索它的内容,并把它作为参数传递到XmlDocument对象的LoadXml方法中。最后,把该XmlDocument对象返回到该Web服务的调用者:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(employeeDataset.GetXml()); return xmlDoc; } catch (Exception ex) {  throw ex; }
  
  在最后的代码块中,你检查了State属性以验证Connection(连接)是否仍然是打开的。如果连接仍然是打开的,你就通过调用该连接对象的Close方法关闭它:
finally {  if (sqlConnection.State == ConnectionState.Open)  {   sqlConnection.Close();  } } }
  
  现在你已经建立了Web服务了,可以用鼠标右键点击EmployeeService.asmx文件并选择Build(建立)和Browse(浏览)来测试它的功能。
 
   在ASP.NET页面中如何使用Web服务行为调用Web服务
 
   在Web页面中使用Web服务行为的第一步是使用类似下面的语法把它嵌入页面代码:
<div id="service" style="BEHAVIOR:url(WebService.htc)"></div>
  
  上面的代码依赖IE 5(及以上版本)内建的行为功能来验证JavaScript文件的位置,而该文件被用于调用Web服务。前面谈到,webservice.htc文件的位置必须与Web页面的文件夹相同。我们要重点注意,行为文件的载入发生在客户端而不是服务器上。
 
   在嵌入了上面的代码后,我们就可以使用JavaScript代码调用行为并把它链接到兼容WSDL 1.1的Web服务了。这是通过引用被嵌入的行为id(前面代码中的服务)和调用它的useService方法来实现的:
service.useService("http://localhost/MyProjects/
WebServiceBehavior/EmployeeService.asmx?WSDL
","sVCEmployee");
  
      你需要在页面的onLoad事件句柄中调用useService方法,这样才能确保在调用Web服务的任何方法之前,该Web服务已经映射了。
 
  UseService方法有下面两个参数:
 
  · Web服务的WSDL文件的路径。
 
  · 用于以后引用该Web服务的一个"友好的"名字。每次使用行为调用EmployeeService.asmx文件中的方法的时候都会使用这个名字。
现在已经建立了Web服务并可以访问它了。异步调用Web服务方法可以分为两个步骤。异步调用的优点是Web页面不用等待Web服务返回。第一步,你调用Web方法并把回调(callback)函数作为参数。第二步,在执行了需要的方法后,Web服务返回,启动回调函数。
 
  下面是完整的源代码列表:
<%@ Page language="C#" Codebehind="EmployeeServiceClient.ASPx.cs" AutoEventWireup="false" Inherits=" EmployeeWebServiceClient.EmployeeServiceClient" %> <HTML> <HEAD> <title>Employee Details</title> <SCRIPT LANGUAGE="JScript"> //定义一个模块级的变量来捕捉事件id var iCallID ; function GetEmployeeDetails() {  // 调用svcEmployee Web服务的GetEmployeeDetails方法  iCallID =   service.svcEmployee.callService(DisplayResults,
"GetEmpDetailsByEmpID",txtEmployeeID.value); } function DisplayResults(result) {  var strXML,objXMLNode,objXMLDoc,objEmployee,strHTML;    //检查事件id是否相同  if (iCallID != result.id)   return;  if(result.error)  {   // 显示错误信息   var faultCode = result.errorDetail.code;   var faultString = result.errorDetail.string;   alert("ERROR: Code = " + faultCode + ", Fault String=" + faultString);  }  else  {   //把结果值赋予本地变量   objXMLNode = result.value;   objXMLDoc = new ActiveXObject("Microsoft.XMLDOM");   //把返回的XML字符串载入XMLDOM对象   objXMLDoc.loadXML(objXMLNode.xml);   //得到Employees节点的指针   objEmployee = objXMLDoc.selectSingleNode("GetEmpDetailsByEmpIDResult").selectSingleNode
(
"EmployeesRoot").selectSingleNode("Employees");   //检查从服务器返回的雇员指针是否有效   strHTML = "<font color=’#0000FF’>";   if (objEmployee != null)   {    //动态生成HTML,并把它添加到一个字符串变量中     strHTML += "<br><br>Employee ID :<b>" +       objEmployee.selectSingleNode("EmployeeID").text + "</b><br><br>";     strHTML += "Employee First Name :<b>" +       objEmployee.selectSingleNode("FirstName").text +       "</b><br><br>";     strHTML += "Employee Last Name :<b>" +       objEmployee.selectSingleNode("LastName").text + "</b><br><br>";     strHTML += "Employee Title :<b>" +       objEmployee.selectSingleNode("Title").text + "</b><br><br>";     strHTML += "Employee Title :<b>" +       objEmployee.selectSingleNode("Title").text + "</b><br><br>";     strHTML += "Title Of Courtesy:<b>" +       objEmployee.selectSingleNode("TitleOfCourtesy").text + "</b><br><br>";     strHTML += "Postal Code:<b>" +       objEmployee.selectSingleNode("PostalCode").text + "</b><br><br>";   }   else   {    strHTML += "<br><br><b>Employee    not found</b>";   }   strHTML += "</font>"   //把动态生成的HTML赋予div标记   divContents.innerHTML = strHTML;  } } function init() {  // 建立Web服务的实例并把它叫做svcEmployee  service.useService("http://localhost/MyProjects/15Seconds/WebServiceBehavior/_    EmployeeWebService/EmployeeService.asmx?WSDL","svcEmployee"); } </SCRIPT> </HEAD> <body onload="init()"> <div id="service" style="BEHAVIOR: url(webservice.htc)"></div> <H1 align="center"> <font color="#800080">Employee Details</H1> </FONT> <br><br> <P align="left"> <font color="#800080"><b>Enter the Employee ID:</b></font> <INPUT id="txtEmployeeID" name="txtEmployeeID" style="LEFT: 149px; TOP: 72px"> <INPUT id="btnAdd" type="button" value="Get Employee
Details
" name="btnGetEmployee" onclick="return GetEmployeeDetails()"> </P> <P></P> <div id="divContents"> </div> <P></P> </body> </HTML>
  
  在GetEmployeeDetails方法中,你通过把回调方法名称和输入参数作为参数传递给Web服务来调用该Web服务的web方法。这是通过调用Web服务行为的callService方法实现的:
function GetEmployeeDetails() { // 调用svcEmployee web服务的GetEmployeeDetails方法 iCallID = service.svcEmployee.callService(DisplayResults,"GetEmpDetailsByEmpID",txtEmployeeID.value); }
0
相关文章