`
love19820823
  • 浏览: 974614 次
文章分类
社区版块
存档分类
最新评论

一个调用ATL Server WebServices 的AJAX客户端

 
阅读更多

请将下面的代码完整复制到soapclient.js中

/**//*****************************************************************************
AJAX
Javascript"SOAPClient"library
ThanktoMr.MatteoCasati,IharVoitka-http://www.guru4.net/
Author:ZhangLiang,E-Mail:cheungmine@gmail.com
Date:2006-8-31
****************************************************************************
*/

function_debug(rownum,msg)...{alert(rownum+":"+msg);}

varSOAP_SUCCESS=0;
varSOAP_FAULT=1;

var_sr_env_hdr_="<soap:Envelope"+
"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/""+
"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance""+
"xmlns:xsd="http://www.w3.org/2001/XMLSchema""+
"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">";

var_sr_body_hdr_="<soap:Bodysoap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">";

var_soap_header_m_token_="";//globalvarible,soap_header:m_token

functionSOAPParams(callid,url,method,async,callback,username,password)
...{
this.callid=callid;
this.url=url;//"http://localhost/MtkWebgisServer/MtkWebgis.dll?Handler=GenMtkWebgisWSDL";
this.svc=null;//"http://cl2/MtkWebgisServer/MtkWebgis.dll?Handler=Default";//未完
this.method=method;

if(async+""=="undefined")
this.async=true;//defaultvalue
else
this.async=async;

if(this.async)...{
if(callback+""=="undefined")
this.callback=soap_callback;
else
this.callback=callback;
}


this.username=null;
if(username+""!="")
this.username=username;

this.password=null;
if(password+""!="")
this.password=password;

this.wsdl=null;
this.result=SOAP_FAULT;
this.xmlhttp=null;//xmlhttpobjectreturned

this._pl=newArray();//inputparameterslist

this.add=function(name,value)...{
this._pl[name]=value;
returnthis;
}


this.toXml=function()...{
varxml="";
for(varpinthis._pl)...{
vart=typeof(this._pl[p]);
if(t=="object"||t=="function")
xml
+="<"+p+">"+this._pl[p].toXml()+"</"+p+">";
else
xml
+="<"+p+">"+this._pl[p].toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</"+p+">";
}

returnxml;
}


this.setToken=function()...{
if(this.method=="login")...{
_soap_header_m_token_
=this.getval("snp:m_token");
}

}


this.getToken=function()...{
return_soap_header_m_token_;
}


this.getval=function(name)...{
varret=SOAPClient._getElementsByTagName(this.xmlhttp.responseXML.documentElement,name).item(0);
returnret.text;
}


this.retval=function()...{
returnthis.getval("return");
}


//SOAP:Fault
this.faultcode=function()...{
returnthis.getval("faultcode");
}


this.faultstring=function()...{
returnthis.getval("faultstring");
}


this.faultdetail=function()...{
returnthis.getval("detail");
}

}


functionSOAPClient()...{}

SOAPClient.invoke
=function(params)
...{
params.result
=SOAP_FAULT;
if(params.async)
SOAPClient._loadWsdl(params);
else
returnSOAPClient._loadWsdl(params);
}


//private:wsdlcache
SOAPClient_cacheWsdl=newArray();

//private:invokeasync
SOAPClient._loadWsdl=function(params)
...{
//loadfromcache?
params.wsdl=SOAPClient_cacheWsdl[params.url];
if(params.wsdl+""!=""&&params.wsdl+""!="undefined")...{
params.svc
=SOAPClient._getService(params.wsdl);
returnSOAPClient._sendSoapRequest(params);
}


//getwsdl
var_xmlhttp=SOAPClient._getXmlHttp();

if(params.username+""!="undefined")
_xmlhttp.open(
"GET",params.url,params.async,params.username,params.password);
else
_xmlhttp.open(
"GET",params.url,params.async);

if(params.async)...{
_xmlhttp.onreadystatechange
=function()...{
if(_xmlhttp.readyState==4)
SOAPClient._onLoadWsdl(params,_xmlhttp);
}

}


_xmlhttp.send(
null);
if(!params.async)
returnSOAPClient._onLoadWsdl(params,_xmlhttp);
}


SOAPClient._onLoadWsdl
=function(params,req)
...{
if(req.readyState==4&&req.status==200)...{
params.wsdl
=req.responseXML;
params.svc
=SOAPClient._getService(params.wsdl);
SOAPClient_cacheWsdl[params.url]
=params.wsdl;//saveacopyincache
returnSOAPClient._sendSoapRequest(params);
}

returnSOAP_FAULT;
}


SOAPClient._sendSoapRequest
=function(params)
...{
//getnamespace,ok
varns=SOAPClient._getAttribValue(params.wsdl.documentElement,"targetNamespace");

//构造SOAP请求,SOAP2.0
varsr=_sr_env_hdr_+"<soap:Header><snp:m_tokenxmlns:snp=""+ns+"">"+
_soap_header_m_token_
+"</snp:m_token></soap:Header>"+
_sr_body_hdr_
+"<snp:"+params.method+"xmlns:snp=""+ns+"">"+
params.toXml()
+"</snp:"+params.method+"></soap:Body></soap:Envelope>";

//sendrequest
params.xmlhttp=SOAPClient._getXmlHttp();
params.xmlhttp.open(
"POST",params.svc,params.async);
params.xmlhttp.setRequestHeader(
"SOAPAction",""#"+params.method+""");//SOAPAction:"#HelloWorld"
params.xmlhttp.setRequestHeader("Content-Type","text/xml;charset=utf-8");

if(params.async)...{
params.xmlhttp.onreadystatechange
=function()...{
if(params.xmlhttp.readyState==4)
SOAPClient._onSendSoapRequest(params);
}

}


try...{
params.xmlhttp.send(sr);
}

catch(ex)...{}

if(!params.async)
returnSOAPClient._onSendSoapRequest(params);
}


SOAPClient._onSendSoapRequest
=function(params)
...{
if(params.xmlhttp.readyState==4&&params.xmlhttp.status==200)...{
params.result
=SOAP_SUCCESS;//未完...
params.setToken();//设置全局变量:_soap_header_m_token_
}


if(params.async&&params.callback)
params.callback(params.result,params);

if(!params.async)
returnparams.result;
}


//private:utils
SOAPClient._getElementsByTagName=function(document,tagName,ns)
...{
try...{
//tryingtogetnodeomittinganynamespaces(latestversionsofMSXML.XMLDocument)
varlst=document.selectNodes(".//*[local-name()=""+tagName+""]");
if(lst.length==0)
throw0;
returnlst;
}

catch(ex)...{}

//oldXMLparsersupport
if(ns+""=="undefined")
returndocument.getElementsByTagName(tagName);

returndocument.getElementsByTagName(ns+":"+tagName);
}


SOAPClient._getService
=function(wsdl)
...{
varsoap_address=SOAPClient._getElementsByTagName(wsdl.documentElement,"address","soap").item(0);
returnSOAPClient._getAttribValue(soap_address,"location");
}


SOAPClient._getAttribValue
=function(node,name)
...{
return(node.attributes[name]+""=="undefined")?node.attributes.getNamedItem(name).nodeValue:node.attributes[name].value;
}


//private:xmlhttpfactory
SOAPClient._getXmlHttp=function()
...{
try...{
if(window.XMLHttpRequest)...{
varreq=newXMLHttpRequest();
//someversionsofMozdonotsupportthereadyStatepropertyandtheonreadystateeventsowepatchit!
if(req.readyState==null)
...{
req.readyState
=1;
req.addEventListener(
"load",
function()
...{
req.readyState
=4;
if(typeofreq.onreadystatechange=="function")
req.onreadystatechange();
}
,
false);
}

returnreq;
}

elseif(window.ActiveXObject)...{
returnnewActiveXObject(SOAPClient._getXmlHttpProgID());
}

}

catch(ex)...{}

thrownewError("YourbrowserdoesnotsupportXmlHttpobjects");
}


SOAPClient._getXmlHttpProgID
=function()
...{
if(SOAPClient._getXmlHttpProgID.progid)
returnSOAPClient._getXmlHttpProgID.progid;
varprogids=["Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
varo;
for(vari=0;i<progids.length;i++)
...{
try
...{
o
=newActiveXObject(progids[i]);
returnSOAPClient._getXmlHttpProgID.progid=progids[i];
}

catch(ex)...{};
}

thrownewError("CouldnotfindaninstalledXMLparser");
}

假设ATL XML WebServices实现方法如下:

[id(1),helpstring("登入系统,获得用户令牌和全图URL,以后任何方法调用必须给出令牌")]

HRESULTlogin([
in]BSTRUsername,[in]BSTRPassword);

id(
2),helpstring("刷新地图,取地图imgURL")]

HRESULTrefresh([out]DOUBLE
*Scale,[out,retval]BSTR*imgURL);

客户端IE中调用如下:

<HTML>
<HEAD>
<TITLE>WebGisDemoPage-WebGisAJAXClient</TITLE>
<scriptlanguage="javascript"src="ajax/soapclient.js"></script>
<scriptlanguage="javascript">
//WebServiceURL
varg_url="http://cl2/mtkwebgis/MtkWebgis.dll?Handler=GenMtkWebgisWSDL";

functionsoap_callback(rcode,params)
...{
if(rcode==SOAP_SUCCESS)
...{
switch(params.callid)
...{
case"刷新":
imgMap.src
=params.retval();//retval()取得[out,retval]参数
alert("当前比例:"+params.getval("Scale"));//getval(...)取得[out]参数
break;
}

}

else
...{
alert(params.callid
+":发生错误");
}

}


functionLogin()
...{
//同步调用,获得令牌
varsoap=newSOAPParams("登录",g_url,"login",false);
soap.add(
"Username","cheung");
soap.add(
"Password","mine");
if(SOAP_SUCCESS==SOAPClient.invoke(soap))
refresh();
else
alert(
"登录失败");
}


functionRefresh()
...{
//异步调用刷新,默认回调函数soap_callback
varsoap=newSOAPParams("刷新",g_url,"refresh");
SOAPClient.invoke(soap);
}

</script>
</HEAD>
<BODYonload="Login();">
<divid="divMap"><imgid="imgMap"></div>
</BODY>
</HTML>

使用soapclient.js需要注意,我假设XML WebServices必须存在如上面所示的login方法,用于验证用户,而且m_token必须是soap头。login原型如下:

[soap_method]
[soap_header(value
="m_token",out=true)]
HRESULTlogin(
/**//*[in]*/BSTRUsername,/**//*[in]*/BSTRPassword)
...{
CHARszID[MAX_TOKEN_LEN
+1];
*szID=0;

DWORDdwSize
=MAX_TOKEN_LEN;
HRESULThr
=m_spSessionSvc->CreateNewSession(szID,&dwSize,&m_spSession);
CHECK_FAILED(hr);

szID[dwSize]
=0;
m_token
=CComBSTR(szID).Detach();

returnhr;
}

这样,用户就可以通过soapclient.js在IE中直接调用ATL Server写的XML WebServices了。

(本文写于2006年9月,cheungmine,上海新区时空信息技术有限公司)

分享到:
评论

相关推荐

    atl_server_web.rar_ATL_ATL Server_atl serv_用ATL

    而`atl_server_web`很可能是一个包含了源代码的文件夹,其中应该有实现了ATL Server Web服务器的示例项目。用户可以通过编译和运行这个示例,直观地了解ATL Server的工作原理,并学习如何在自己的项目中应用。 总的...

    AtlServer.zip

    AtlServer.zip webserver中用到的东西 有需要的下载

    ATL_Server_Source_and_Headers

    ATL Server则是ATL的一个扩展,它为构建高效、轻量级的Web服务和HTTP服务器提供了强大的支持。这个压缩包"ATL_Server_Source_and_Headers"包含了ATL Server的源代码和头文件,对于深入理解ATL Server的工作原理以及...

    vc调用Webservices

    描述中提到的“vc 调用webservice的实例源码”意味着提供的压缩包可能包含一个实际的VC++项目,该项目演示了如何实现这一功能。开发者可以通过研究这个源码,学习如何在自己的应用中实现对Web服务的调用。这通常包括...

    AtlServer.rar

    在VS2008中移除了对ATL Server的内置代码,而是把它独立为一个开源项目,见 http://www.codeplex.com/AtlServer/ 但这意味着原来在vs2003,vs2005程序中使用了以下头文件的程序将编译出错, 如 fatal...

    ATL开发COM及客户端调用举例

    在本示例中,“ATL开发COM及客户端调用举例”显然是一个面向初学者的教学资源,它包括了COM服务器端和客户端的实现,以帮助开发者理解如何使用ATL创建和调用COM组件。 COM是一种跨进程的二进制标准,允许不同语言...

    ATL Server编译生成的sproxy.exe

    ATL Server编译生成的`sproxy.exe`是一个关键的开发工具,主要用于C++开发者在调用Web服务时生成对应的代理类文件(`.h`头文件)。这个工具是Microsoft ATL(Active Template Library)的一部分,ATL Server是微软为...

    ISAPI_using_ATL.zip_ATL_ATL Server ISAPI

    ATL Server是ATL的一个扩展,特别针对Web服务开发进行了优化,提供了更简洁、高效的API来创建HTTP服务器应用程序。 **ISAPI基础** ISAPI扩展通常由两个部分组成:一个入口点DLL和一个或多个HTTP处理函数。入口点...

    ATL_Server_Source_and_Headers_9_0_70425_Alpha

    ATL Server是一个由微软开发的轻量级服务器框架,它主要基于Active Template Library (ATL) 技术,用于构建高效、快速的网络应用程序,尤其是Web服务。ATL Server提供了强大的HTTP服务支持,使得开发者能够方便地...

    ATL_Server_Source_and_Headers_9_0_70425_Alpha.zip

    ATL Server是ATL的一个扩展,专为构建高效、轻量级的Web服务和HTTP服务器应用程序而设计。这个压缩包"ATL_Server_Source_and_Headers_9_0_70425_Alpha.zip"包含了ATL Server 9.0.70425 Alpha版本的源代码和头文件,...

    温度转换:使用ATL Server和MFC Client的XML Web服务

    标题中的“温度转换:使用ATL Server和MFC Client的XML Web服务”指的是一个通过XML Web服务实现的温度转换应用,该应用利用了Microsoft的ATL(Active Template Library)服务器和MFC(Microsoft Foundation Classes...

    ATL.Server

    ATL Server

    AtlServer(生成sproxy工具).rar

    不过ATL Server代码已经托管到开源网站上,我们可以找到ATL Server的源代码,编译出Sproxy.exe,这个工具可以根据wsdl文件来生成非托管的代理类。这个代理类还需要配合一些头文件才能一起使用,这个相关的头文件都...

    VC++中WebService服务的调用

    使用上述方法,你可以构建一个客户端程序,通过发送文本内容到WebService,然后接收并显示翻译后的结果。 总的来说,VC++调用WebService涉及XML、HTTP和COM技术的综合运用。理解这些基础原理,熟练掌握MSXML或ATL的...

    Atl调用WTL生成界面

    首先,Atl是COM编程的一个强大工具,它提供了一系列模板类,帮助开发者快速创建COM对象,包括服务器和客户端。Atl使得COM对象的实现变得简单,因为它处理了许多底层细节,如接口管理、内存管理和线程安全等。 WTL则...

    ATL(表准COM文件的建立,C#调用C++写的dll)

    总的来说,这个过程展示了如何利用ATL创建一个简单的COM组件,该组件包含一个方法和一个事件,然后在C#应用程序中调用这个组件的方法和事件。ATL简化了COM组件的开发,而C#则提供了方便的方式来调用和交互这些组件。...

    C++使用webservices

    以下是一个简单的步骤来展示如何在VC++中调用XML Web Service: 1. **理解WSDL**:首先,你需要获取Web Service的WSDL文件,这个文件定义了服务的接口、方法和输入/输出参数。你可以使用工具如SoapUI或者Visual ...

    ATL Server 标签查找器 v1.0.1

    开发ATL Server时常常被srf文件中的非法标签导致的500内部服务错误抓狂,MS给的提示太原始了,竟然没有提示哪个标签非法,为了快速查找非法标签开发了这个工具。也可以作为其它文本文件标签信息的快速查找工具。 比...

    atl 2019 头文件和库

    这包括 ATL Server,一个基于ATL的Web服务开发框架,可以用来快速开发ASP.NET和WCF服务。 8. **ActiveX控件**: ATL使得创建高性能、小巧的ActiveX控件变得容易。通过`CAxWindow`类和一系列控件基类,开发者可以快速...

Global site tag (gtag.js) - Google Analytics