使用Javascript调用Webservice

时间:2010-03-31 04:00:34

标签: javascript web-services

我正在尝试使用javascript调用web服务。但它显示的错误就像 selectSingleNode()不是一个方法。我在mozilla firefox中尝试它。当我将XMLHttpRequest更改为ActiveXObject时,它正在探索器中完美地工作。我正在添加我在firefox中尝试的源代码。

<script language="javascript">
// Web Service functionality
// Global vars
var xmlDoc = null;
var _serviceCallback = null;


// Calls web service, web service url and parms, and callback function or null must be provided.
// Callback function receives a true or false based on success of call to host
function callWebService(url, callback)
{
    _serviceCallback = callback;

    if(xmlDoc == null)
    {
       // xmlDoc = new XMLHttpRequest();
 xmlDoc = new XMLHttpRequest();

    }

    xmlDoc.onreadystatechange = stateChange; //callback for readystate
    xmlDoc.async = true; //do background processing

    //xmlDoc.load(url);
 xmlDoc.open('GET', url);
 xmlDoc.send();
 //var doc= xmlDoc.responseXML;

}

// Updates readystate by callback
function stateChange()
{
    if (xmlDoc.readyState == 4)
    {
 var err = xmlDoc.parseError;
        var result = false;
        var nd;
        if(err.errorCode == 0)
        {
            nd = xmlDoc.selectSingleNode("//envelope/date_time");
            if(nd.text != "")
                result = true;
        }

        // perform callback if provided
        if(_serviceCallback != null)
            _serviceCallback(result, nd == null ? "" : nd.text);
    }
}

// Callback supplied to XMLHttpRequest call
function callbackTest(result, data)
{
   obj = document.getElementById("txtOuput");

   if(result)
      obj.value = "Success " + data;
   else
      obj.value = "Web Service Call Failed"; 
}
   </script>
<input type="button" onclick="callWebService('http://www.hendricksongroup.com/services/WebService.asmx/GetTime?input=Test', callbackTest)" value="Click" />
<input type="text" id="txtOuput"/>

请帮助我......已经杀了我8个小时......

3 个答案:

答案 0 :(得分:1)

我建议使用jquery库。它有一些非常漂亮的get,put和ajax调用机制。它将适用于所有浏览器,如果有很多教程和支持论坛可以帮助您解决问题

答案 1 :(得分:1)

首先,您需要使用跨浏览器技术来确保获得有效的XMLHttpRequest对象。

这种方法不仅可以为浏览器提供最佳的XHR,而且还具有“记忆”功能。这意味着工厂逻辑仅执行一次。

您可以在JS here中了解有关调用各种类型服务的更多信息。

function createXHR() {
    var xmlhttp, XMLHttpFactories = [
        function() {
            return new XMLHttpRequest();
        }, function() {
            return new ActiveXObject("Msxml2.XMLHTTP");
        }, function() {
            return new ActiveXObject("Msxml3.XMLHTTP");
        }, function() {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    ];
    for (var i = 0; i < XMLHttpFactories.length; i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
            this.createXHR = XMLHttpFactories[i];
            return xmlhttp;
        } catch (e) { }
    }
}

其次,您需要使用crossbrowser技术来使用xml。您可以向http://www.w3schools.com/Xml/xml_parser.asp

学习
if (window.DOMParser)
  {
    parser=new DOMParser();
    xmlDoc=parser.parseFromString(text,"text/xml");
  }
else // Internet Explorer
  {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async="false";
    xmlDoc.loadXML(text); 
  }

OR

if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else // Internet Explorer 5/6
  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET","books.xml",false);
xhttp.send("");
xmlDoc=xhttp.responseXML;

答案 2 :(得分:0)

我建议使用JSON。它非常简单,浏览器兼容性由JSON scrypting处理。

就像使用代理调用webservice,调用公共函数并传递值(如果有的话)。此代码仅适用于.NET。

创建网络服务,不要忘记添加ScriptService标签。

// Summary description for RScriptService /// </summary>
[WebService(Namespace = "http://tempuri.org/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService()] public class ProfileService : System.Web.Services.WebService {Public string ExecuteCommand(param, param,param){}

}

在您的aspx文件中添加脚本条目

<cc1:ToolkitScriptManager ID="ScriptManager1" AsyncPostBackTimeout="600" runat="server" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError"EnablePageMethods="true"><Services><asp:ServiceReference Path="ProfileService.asmx"/></Services></cc1:ToolkitScriptManager>

使用Javascript代码调用这些网络服务。

//Call the function function GetProfileDetails(){ProfileService.ExecuteCommand(request1,request2, OnGetProfileDetailsSuccess, OnGetProfileDetailsError);}

//Call back for succes function OnGetProfileDetailsSuccess(result){for (var property in result) {//get the result result[property];}}

//Call back for error function OnGetProfileDetailsError(error) {alert("An error occured while executing command<br/>" + error.get_message());}

希望这会有所帮助..