异步调用webservice返回responseXML为空的问题解决方法

先总结几个要领

  1)要熟悉javascript对XML文件的加载与操作;

  DOM的XML操作可参考的示例:http://www.w3school.com.cn/xmldom/met_document_getelementsbytagname.asp

  2)在IE下面还是要通过loadXML来转responseText;

  3)xml加载后异步属性设置;

  4)命名空间处理等问题;

  下面上代码:

  ========ASPX前台代码========

  

复制代码 代码如下:

  <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

  <!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></title>

  </head>

  <body>

  <form id="form1" runat="server">

  <div id="div1">

  </div>

  </form>

  <p><input id="Button1" type="button" value="button" onclick="RequestWebService();" /></p>

  <script type="text/javascript">

  var sUsrAgent = navigator.userAgent;

  var isIE = sUsrAgent.indexOf("MSIE") != -1;

  var isIE6 = isIE && sUsrAgent.indexOf("MSIE 6.0") != -1;

  var isIE7 = isIE && sUsrAgent.indexOf("MSIE 7.0") != -1;

  var isFF = sUsrAgent.indexOf("Firefox") != -1;

  var isOP = sUsrAgent.indexOf("Opera") != -1;

  var isSF = sUsrAgent.indexOf("Safari") != -1 && sUsrAgent.indexOf("Chrome") == -1;

  var isCH = sUsrAgent.indexOf("Chrome") != -1;

  var xmlHttp;

  function RequestWebService() {

  //这是我们在第一步中创建的Web服务的地址

  var URL = "http://localhost:3165/WebSite2/Service.asmx";

  //在这处我们拼接

  var data;

  data = '<?xml version="1.0" encoding="utf-8"?>';

  data = data + '<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">';

  data = data + '<soap12:Body>';

  data = data + '<HelloWorld xmlns="http://tempuri.org/" />';

  data = data + '</soap12:Body>';

  data = data + '</soap12:Envelope>';

  //创建异步对象

  xmlHttp = GetXmlHttpObject();

  xmlHttp.open("POST", URL, false);

  if (xmlHttp.overrideMimeType) {

  xmlHttp.overrideMimeType('text/xml');

  }

  xmlHttp.SetRequestHeader("Content-Type", "application/soap+xml");

  xmlHttp.onreadystatechange = stateChanged;

  xmlHttp.Send(data);

  }

  function stateChanged() {

  if (xmlHttp.readyState == 4) {

  if (xmlHttp.status == 200) {

  alert(xmlHttp.getAllResponseHeaders());

  alert(xmlHttp.responseText); // 这个有

  //var xmlDoc = xmlHttp.responseXML; // 这个是空的,但下面会让它出来

  var xmlDoc = loadXMLDoc();

  xmlDoc.setProperty("SelectionNamespaces", 'xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ws="http://tempuri.org/" ');

  // 这面这段是命名空间(包含显示与匿名的两种)处理方法,必须加上!

  var node = xmlDoc.selectSingleNode("/soap:Envelope/soap:Body/ws:HelloWorldResponse/ws:HelloWorldResult"); //这边能有值就OK了,为了它前后消耗了1周时间!

  document.getElementById("div1").innerHTML = node.nodeTypedValue;

  }

  }

  }

  function GetXmlHttpObject() {

  var xmlHttp = null;

  try {

  // Firefox, Opera 8.0+, Safari

  xmlHttp = new XMLHttpRequest();

  }

  catch (e) {

  // Internet Explorer

  try {

  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

  }

  catch (e) {

  xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

  }

  }

  return xmlHttp;

  }

  function loadXMLDoc() {

  var xmlDoc;

  if (isIE) {

  xmlDoc = getMSXmlParser();

  xmlDoc.async = false;

  xmlDoc.loadXML(xmlHttp.responseText); //webservice response 需要用loadXML

  //xmlDoc.load(xmlHttp.responseText); // 加载xml文档需要用load

  }

  else {

  xmlDoc = xmlHttp.responseXML;

  if (!xmlDoc) {

  xmlDoc = (new DOMParser()).parseFromString(xmlHttp.responseText, 'text/xml');

  }

  }

  return xmlDoc;

  }

  function getMSXmlParser() {

  var parser = [ 'Msxml2.DOMDocument.6.0',

  'Msxml2.DOMDocument.5.0',

  'Msxml2.DOMDocument.4.0',

  'Msxml2.DOMDocument.3.0',

  'MSXML2.DOMDocument',

  'Microsoft.XMLDOM']; // the same as MSXML.DOMDocument

  for (var i in parser) {

  try {

  var xParser = new ActiveXObject(parser[i]);

  if (xParser) {

  return xParser;

  }

  }

  catch (e) { }

  }

  return null;

  }

  </script>

  </body>

  </html>

  ========后台CS文件========

  其实这段没有实质内容

  

复制代码 代码如下:

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Web;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  public partial class _Default : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  }

  }

  ========WebService代码========

  

复制代码 代码如下:

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Web;

  using System.Web.Services;

  [WebService(Namespace = "http://tempuri.org/")]

  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

  // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。

  // [System.Web.Script.Services.ScriptService]

  public class Service : System.Web.Services.WebService

  {

  public Service () {

  //如果使用设计的组件,请取消注释以下行

  //InitializeComponent();

  }

  [WebMethod]

  public string HelloWorld() {

  return "Hello World";

  }

  }

  ========返回的responseText========

  

复制代码 代码如下:

  <?xml version="1.0" encoding="utf-8"?>

  <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <soap:Body>

  <HelloWorldResponse xmlns="http://tempuri.org/">

  <HelloWorldResult>Hello World</HelloWorldResult>

  </HelloWorldResponse>

  </soap:Body>

  </soap:Envelope>

  结束!