用IE的Web服务建立ASP.NET应用程序(3)
点击次数:11 次 发布日期:2008-11-26 15:33:50 作者:源代码网
|
源代码网推荐 源代码网推荐 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); 源代码网推荐 } 源代码网推荐 源代码网推荐 CallService方法返回一个唯一的标识符,它可以用于识别Web服务调用。如果你进行多个异步Web服务调用,接着在客户端浏览器中把结果拼装在一起,那么这个标识符就是必要的。在这种情况下,你把这个ID与作为result对象的一个属性返回的ID进行匹配。匹配过程是在回调函数中完成的: 源代码网推荐 源代码网推荐 function DisplayResults(result) 源代码网推荐 { 源代码网推荐 var strXML,objXMLNode,objXMLDoc,objEmployee,strHTML; 源代码网推荐 源代码网推荐 在下面几行代码中,你把result对象的ID与callService方法返回的ID进行匹配: 源代码网推荐 源代码网推荐 //检查事件是否相同 源代码网推荐 if (iCallID != result.id) 源代码网推荐 return; 源代码网推荐 源代码网推荐 接着检查error属性以确定在Web服务的执行过程中是否发生过错误。如果发生过错误,就在消息窗口中显示错误信息。如果没有错误,就处理返回的结果并把它们显示在HTML DIV标记中: 源代码网推荐 源代码网推荐 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"); 源代码网推荐 //查看从服务器返回的employee 指针是否有效 源代码网推荐 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; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 在上面的例子中,你使用调用Web服务时指定的回调函数来处理Web服务返回的结果。还有一种办法,在定义DIV标记的时候你也可以指定一个回调函数(用这种方法把Web服务行为包含在页面中)。例如,在下面的代码中,你使用Web服务行为支持的onresult事件句柄指定了回调函数: 源代码网推荐 源代码网推荐 <div id="service" style="BEHAVIOR: url(webservice.htc)" 源代码网推荐 onresult="DisplayResults()"></div> 源代码网推荐 源代码网推荐 有了上面的定义后,你就可以在DisplayResults函数中处理Web服务返回的结果了。下面的代码演示了DisplayResults函数的一种实现示例: 源代码网推荐 源代码网推荐 function DisplayResults() 源代码网推荐 { 源代码网推荐 //检查事件id是否相同 源代码网推荐 if (iCallID != event.result.id) 源代码网推荐 return; 源代码网推荐 if(event.result.error) 源代码网推荐 { 源代码网推荐 var faultCode = event.result.errorDetail.code; 源代码网推荐 var faultString = event.result.errorDetail.string; 源代码网推荐 alert("ERROR: Code = " + faultCode + ", Fault String=" + 源代码网推荐 faultString); 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 //显示结果值 源代码网推荐 alert(event.result.value); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 在代码中你可以看到,我们使用event对象得到包含Web服务调用返回结果的result对象的指针。 源代码网推荐 源代码网推荐 把代码放在一起 源代码网推荐 源代码网推荐 如果使用浏览器查看上面的ASP.NET页面,你看到的输出类似下图。在employee文本框中输入一个有效的Employee ID并点击"Get Employee Details"调用远程Web服务。这种操作将导致对该Web服务的异步调用,并且该Web服务返回的结果将显示在Web页面的DIV元素中。 源代码网推荐 源代码网推荐
源代码网推荐 源代码网推荐 我要再次重点强调,对于IE Web服务行为,需要IE 5或以上版本,因此如果你能够确定用户所使用的浏览器类型,这种技术就很适合用于企业内部网应用程序。 源代码网推荐 源代码网推荐 结论 源代码网推荐 源代码网推荐 在本文中,你看到了Web服务行为是如何提供一种从Web服务器向客户端浏览器传递信息的改进的解决方法的。使用Web服务行为调用远程Web方法简化了客户端的操作,使Web服务的使用更加有吸引力。我们同时看到Web服务行为是如何通过提供动态的交互操作Web页面,帮助我们提高了用户体验的。由于Web服务行为(webservice.htc文件)封装了使用SOAP调用远程Web服务所需要的代码,随着SOAP标准的演化,你可以独立地更新行为而不需要改变客户端脚本。 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
