分享
 
 
 

Lostinet作品:JScriptSoapClientv0.10Beta为你轻松调用WebService

王朝html/css/js·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Lostinet作品:JScriptSoapClientv0.10Beta为你轻松调用WebService

Lostinet主站

http://lostinet.d2g.com/Lostinet-Publish/JScriptSoapClient/

做了一个WebService后,是不是很痛恨客户端没有安装SOAPTOOLKIT???

用这个JScript的实现版,为你轻松实现WebService的调用

/*

JScriptSoapClient For .Net 0.10 Beta

作者:迷失网络[Lostinet]

为你的WebService提供简单易用的调用方案

暂时只支持 string,int,float,double,boolean 的传输

使用方法:

var wsdl=new JScriptSoapClient("http://host.com/webservice.asmx?WSDL");

var ws=wsdl.CreateWebService("webservicename");

var res=ws.MethodName(arg1,arg2);

alert(res);

alert(res.Length);

alert(res.Item(0)+res.Item(1).Value+res.Item(2).Type);

*/

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

说明

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

Lostinet

JScriptSoapClient v0.10 Beta 说明文档

Copyright @2002 http://www.lostinet.com (Lostinet),All Right Reserved.

[1.简介][2.兼容性][3.使用例子][4.对象模型参考][5.WebService分析过程][6.WebMethod调用过程]

1。简介

JScriptSoapClient(以下称JSSC)是一个用JScript实现的SOAP的客户端工具。 它为你提供一个简单有效的脚本编程方法来访问WEB中的WebService(针对Microsoft.Net的WebService)。在这个版本中,JSSC提供了基本的访问方法,和对简单数据传输类型的支持。JSSC支持多个参数的输入和多个参数的返回。

JSSC的设计目标是,尽量使SOAP的[WebMethod]被模拟成客户端的一个对象的成员函数。

[返回顶部]

2。兼容性

服务器端:

JSSC的编写过程中是完全依照MICROSOFT.NET的WebService中的*.asmx文件而做的。在测试版中,不能保证对 .Net WebService 有完整的支持。在以后发行的正式版中,也不能保证对非 .Net WebService的实现有足够的支持。

JSSC v0.10 Beta 只支持对SOAPHTTP http://schemas.xmlsoap.org/soap/http的绑定。只支持的数据类型:string,int,float,double,boolean。

在客户端:

JSSC是针对Microsof Internet Explorer而设计的。当然以后推出的正式版可以在WSH等脚本环境中使用。但是JSSC仍然是被设计为针对Microsoft Internet Explorer而实现。JSSC需要Microsoft.XMLDOM和Microsoft.XMLHTTP两个组件的支持(在windows98以后的版本就有)。

异步调用的支持:

JSSC v0.10 Beta 不支持异步调用。但以后的版本会提供这个功能。

[返回顶部]

3。使用例子

代码写法的简单例子:

下面的例子告诉你,用JSSC调用WebMethod有很强的灵活性。

<script language="JScriptSoapClient.js"></script>

<script>

//获取WSDL

var wsdl=new JScriptSoapClient("/webservice.asmx?WSDL");

//webservicename是[WebService]属性中定义的name

var ws=wsdl.CreateWebService("webservicename");

//下面的Add,JoinString,SwapString都是.Net中的类的函数成员[WebMethod]

alert(ws.Add(33,44));//alert(77);

alert(ws.JoinString("hello","world"));//alert("helloworld");

//public void SwapString(string inA,string inB,out string outA,outString outB)

//{

// outA=inB;

// outB=inA;

//}

var res=ws.SwapString("aa","bb");

alert(res);//alert(res.Item(0))=>alert(res.Item("outA"))=>alert("bb");

alert(res.Item(1));//alert(res.Item(1).Value);

alert(res.Item(1).Type);//alert("string");//defined in /webservice.asmx?WSDL

</script>

[返回顶部]

4。对象模型参考

函数JScriptSoapClient(wsdlurl,username,password)

获取wsdlurl指定的WSDL XML的并且分析WSDL XML数据,返回JSSC_WSDL对象

语法:

var wsdl=JScriptSoapClient(url[,password][,password]);

var wsdl=new JScriptSoapClient(url[,password][,password]);

wsdlurl:WSDL的位置,例如http://yourhost.com/ws.asmx?WSDL

[可选]username:登陆服务器的用户名字

[可选]password:登陆服务器的密码

返回值:

一个JSSC_WSDL对象。使用该对象创建JSSC_WS对象

说明:

如果获取WSDL时发生错误,那么就会发出异常。这个需要向服务器取WSDL XML,所以时间会根据网络而定。JSSC v0.10 Beta 没有异步创建的功能。

对象JSSC_WSDL

来自:(请见5.WebService分析过程)

JScriptSoapClient(url[,password][,password]);

new JScriptSoapClient(url[,password][,password]);

内部成员

_url 调用JScriptSoapClient时保留的参数

_username 调用JScriptSoapClient时保留的参数

_password 调用JScriptSoapClient时保留的参数

[调试]_xd 调用JScriptSoapClient时生成的Microsoft.XMLDOM对象,包含WSDL的内容

_collNs NameSpace的集合

_collPf 在WSDL中NameSpace对应的prefix

属性

CollWebServiceInfo [JSSC_InfoCollection],包含了JSSC_WebServiceInfo的集合

方法

JSSC_WebService CreateWebService(name)

根据name生成JSSC_WebService对象

语法:

var ws=jsscwsdlobj.CreateWebService("webservicename");

参数:

name WSDL中的//definitions/service/@name。

返回值:

JSSC_WebService 对象。

说明:

如果WSDL中有定义JSSC版本所不支持的传输绑定类型,或数据传输类型,那么抛出异常。

对象JSSC_WebService

来自:

JSSC_WSDL::CreateWebService(name)

JSSC_WebServiceInfo::Create()

内部成员:

__webserviceinfo__ 相关的JSSC_WebServiceInfo对象

属性:

["WebMethodName"]和.WebMethodName

返回JSSC_WebMethod对象。该对象为了以后版本的异步调用做准备

方法:(请见6.WebMethod调用过程)

JSSC_ReturnValueCollection ["WebMethodName"](args....)

根据WSDL生成的函数。

语法:

var resObj=jsscwebserviceobj["methodname"]([arg1][,arg2]...)

var resObj=jsscwebserviceobj.methodname([arg1][,arg2]...)

参数:

arg1,arg2,.....WebService生成的参数队列

对象JSSC_WebMethod

因为异步调用还没有写,这个就暂时不写说明

对象JSSC_ReturnValueCollection

来自:

webmethodobj();

JSSC_WebService::webmethodname();

默认属性:

this.Item(0).Value 或者 undefined;

属性:

Length 返回值的数量

方法:

Item(indexorname) 返回JSSC_ReturnValue

对象JSSC_ReturnValue

来自:

JSSC_ReturnValueCollection::Item(indexorname)

默认属性:

this.Value

属性:

Name 返回值的名字

Type 返回值的类型

Value 返回值的值

对象JSSC_WebServiceInfo

来自:

JSSC_WSDL::CollWebServiceInfo.Item(indexorname)

JSSC_InfoCollection::Item(indexorname)

内部属性:

_wsdl :相关的JSSC_WSDL

属性:

SupportSoap:是否支持SOAPHTTP,如果不支持,那么Create方法会抛出异常

Name:WebService的名字,C#在[WebService]中定义,VB.Net在<WebService>中定义

Url :响应WebService的URL

CollWebMethodInfo : JSSC_InfoCollection,JSSC_WebMethodInfo的集合

方法:

JSSC_WebService Create();

创建一个JSSC_WebService对象.

如果SupportSoap为false,或者CollWebMethodInfo中有一个JSSC_WebMethodInfo::IsUsable为false,那么函数抛出异常

对象JSSC_WebMethodInfo

来自:

JSSC_WebServiceInfo::CollWebMethodInfo.Item(indexorname)

JSSC_InfoCollection::Item(indexorname)

内部属性:

_wsi 相关的 JSSC_WebServiceInfo

属性:

Name WebMethod的名字

SoapAction POST的时候的SOAPAction头

IsUsable 是否可用->如果不支持相关的数据传输类型,那么IsUsable为false;JSSC_WebServiceInfo::Create调用会发出异常

CollParamInInfo 略

CollParamOutInfo 略

方法:

Create 略

对象JSSC_InfoCollection

Length

Item(indexorname)

注意大小写,其他略

[返回顶部]

5。WebService分析过程

过程由JScriptSoapClient函数完成,略

[返回顶部]

6。WebMethod调用过程(高级)

同步调用:

请先把JSSC_ReturnValueCollection看明白再继续看这里:

WebMethod的参数调用规则是根据WSDL XML的说明来使用的。

而对应的C#的函数关系是,

C#METHOD中的return,out都作为ReturnValueCollection的成员返回。

其他的都作为JSSC_WebMethod的参数输入。

具体的例子说明如下:

例子一.

public string HelloWorld()

{

return "HelloWorld";

}

由于HelloWorld有一个return 那么JSSC_Method调用的时候,没有输入参数。输出的ReturnValueCollection有一个成员 JSSC_ReturnValue

和这个是功能相同(除了ReturnValue的Name不同)

public void HelloWorld(out string return1)

{

return1="HelloWorld";

}

调用的方法是:

var res=ws.HelloWorld()+"";//+""强迫把res由对象转为string

或者:

var res=ws.HelloWorld().Item(0).Value;

或者不转换:

var res=ws.HelloWorld()

例子二

public double Add(int i1,int i2)

{

return i1+i2;

}

那么这个例子的调用是:

var res=ws.Add(33,44).Item(0).Value;

例子三

public void SwapString(string inA,string inB,out string outA,out string outB)

{

outA=inB;

outB=inA;

}

那么这个例子的调用是:

var res=ws.SwapString("hello","world");

//res.Length -> 2;

//res.Item(0).Value -> "world";

//res.Item(1).Value -> "hello";

异步调用:

还没有做,略

[返回顶部]

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

代码:

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

/****************************************************************<lostinet:source xmlns:lostinet="http://www.lostinet.com/lostinet-source/">

<lostinet:source-info>

<lostinet:name>JScriptSoapClient For .Net</lostinet:name>

<lostinet:version>0.10</lostinet:version>

<lostinet:description>SoapClient的JScript实现,Beta版</lostinet:description>

</lostinet:source-info>

<lostinet:author-info>

<lostinet:name>Lostinet</lostinet:name>

<lostinet:email>lostinet@21cn.com;lostinet@chongjian.com;</lostinet:email>

<lostinet:homepage>http://www.lostinet.com/</lostinet:homepage>

</lostinet:author-info>

<lostinet:copyright-info>

<lostinet:copyright>版权声明:这个软件可以随意发布。也可以根据具体情况进行优化修改。但是请保留作者的相关信息。</lostinet:copyright>

</lostinet:copyright-info>

</lostinet:source>

\****************************************************************/

/*

JScriptSoapClient For .Net 0.10 Beta

作者:迷失网络[Lostinet]

为你的WebService提供简单易用的调用方案

暂时只支持 string,int,float,double,boolean 的传输

使用方法:

var wsdl=new JScriptSoapClient("http://host.com/webservice.asmx?WSDL");

var ws=wsdl.CreateWebService("webservicename");

var res=ws.MethodName(arg1,arg2);

alert(res);

alert(res.Length);

alert(res.Item(0)+res.Item(1).Value+res.Item(2).Type);

*/

@cc_on

@set @debug=true

//Only Support http://schemas.xmlsoap.org/wsdl/soap/

//For IE DHTML

function JScriptSoapClient(url,username,password)

{

//ThrowError:代替throw

function ThrowError(msg){

//抛出异常

throw(new Error(-1,msg));

}

@if(@debug)

//ASSERT:当mustbetrue为false时,抛出带msg的异常

function ASSERT(mustbetrue,msg){

//验证mustbetrue

msg?null:(msg="下面函数发生未指定错误:\m"+fs().caller);

if(false==mustbetrue)ThrowError("ASSERT - 发生错误:\n"+msg);

}

//BREAKPOINT:询问是否用抛出异常的方法来中断调试

function BREAKPOINT(msg)

{

msg?null:(msg=fs().caller);

msg="BREAKPOINT,是否抛出异常?:\n"+msg;

if(confirm(msg))

{

ThrowError("BREAKPOINT抛出异常");

}

}

function ALERT(msg)

{

alert("调试信息,请注意:\n"+msg);

}

@else

function ASSERT(mustbetrue,msg){

//验证mustbetrue

//no debug

}

function BREAKPOINT(msg)

{

}

function ALERT(msg)

{

}

@end

//fs:在某个函数中调用fs()可以得到该函数本身

function fs(){

//返回fs的调用者

return fs.caller

}

//判断函数是不是用new来运行

function IsCalledByNew(_this)

{

try{

//检测是否为new

if(_this&&_this.constructor&&fs().caller==_this.constructor)

{

return true;

}

}

catch(x){

}

return false;

}

//var t=GetUndefined();那么"undefined"==typeof(t)

function GetUndefined(){}

//prefix:baseName,当prefix为空,返回baseName

function GetNodeName(prefix,baseName)

{

if(""!=prefix)return prefix+":"+baseName;

return baseName;

}

function TagNameToPrefix(tagName)

{

ASSERT(typeof(tagName)=="string","TagNameToBaseName():"+tagName);

if(tagName.indexOf(":")==-1)return "";

return tagName.substr(0,tagName.indexOf(":"));

}

function TagNameToBaseName(tagName)

{

ASSERT(typeof(tagName)=="string","TagNameToBaseName():"+tagName);

if(tagName.indexOf(":")==-1)return tagName;

return tagName.substring(tagName.indexOf(":")+1,tagName.length);

}

//根据namespaceURI返回prefix

function GetXMLNSPrefix(de,ns)//de documentElement , ns namespace

{

ASSERT(null!=de&&null!=ns,"GetXMLNSPrefix参数错误");

var nsAttr=de.attributes;

for(var i=0;i<nsAttr.length;i++)

{

var nAttr=nsAttr.item(i);

if("xmlns"==nAttr.prefix)

{

if(nAttr.nodeValue==ns)

return nAttr.baseName;

}

if(""==nAttr.prefix)

{

if("xmlns"==nAttr.baseName&&nAttr.nodeValue==ns)

return "";

}

}

return null;

}

function GetCollLength(coll)

{

ASSERT(typeof(coll)=="object","GetCollLength()调用错误,coll为"+coll);

var i=0;

for(var item in coll)

{

i++;

}

return i;

}

/******************************** Function Class:

\********************************/

//异步调用,还没有做哦。。

function CreateFunctionOfAsyncCall(wm)

{

var func=(function(){

return wm._Invoke(wm._ws,wm._wmi,fs().arguments);

});

/*

func.Timeout=0;

*/

return func;

}

//不知道改什么名字好,,就是ReturnValue的实例,和WebServiceInfo等不同

function ReturnValueInfo(name,v,type)

{

var rvi=Object();

rvi.Name=name;

rvi.Value=v;

rvi.Type=type;

rvi.toString=rvi.valueOf=(function(){

return this.Value;

});

return rvi;

}

//CollReturnValue:实现多个返回值的默认值实现

//和InfoCollection不同,不支持[indexorname]

function CollReturnValue()

{

var rv=new Object();

rv.GetDefaultValue=(function(){

if(this._oDefalutValue)return this._oDefalutValue.Value;

return GetUndefined();

});

rv.toString=rv.valueOf=(function(){

return this.GetDefaultValue();

});

rv._oDefalutValue=null;

rv._oColl=InfoCollection();

rv._add=(function(obj){

if(this._oDefalutValue==null)

this._oDefalutValue=obj;

return this._oColl._add(obj);

});

rv.Length=(function(){

return this._oColl.Length();

});

rv.Length._this=rv;

rv.Length.toString=rv.Length.valueOf=(function(){

return this._this._oColl.Length();

});

rv.Item=(function(index){

return this._oColl.Item(index);

});

return rv;

}

//InfoCollection:实现 .CollWebServiceInfo,.collWebMethodInfo等集合对外暴露

//使用语法:

//coll.Length,

//coll(name),coll.Item(name)

//coll[index],coll(index)

//coll.Item(index),coll.Item[index],

function InfoCollection()

{

//因为要支持coll(index)

ASSERT(!IsCalledByNew(this),"InfoCollection():不能用new 来调用");

//创建对象,支持coll(index),coll(name)

var info=(function(index){

//用coll.item来实现

return fs().Item(index);

});

//内部数据

info._length=0;

info._coll=new Object();

//属性Length的实现

info.Length=(function(){

return this._length;

});

info.Length._this=info;

info.Length.valueOf=info.length.toString=

(function(){

return this._this._length;

});

//方法Item的实现

info.Item=(function(index){

var i=0;

for(var item in this._coll)

{

if(index==item)return this._coll[item];

if(index==i)return this._coll[item];

i++;

}

BREAKPOINT("InfoCollection::Item()找不到元素");

return null;

});

//添加一个xxxInfo,asindex代表依赖名字来储存,暂时允许重复吧。

info._add=(function(obj,asindex){

ASSERT(typeof(obj)=="object"&&""!=obj.Name,"InfoCollection::_add obj不符合要求");

asindex?asindex=true:asindex=false;

if(this._coll[obj.Name]&&asindex==false)return;

if(asindex)

{

this._coll[this._length]=obj;

this._length+=1;

}

else

{

this._coll[obj.Name]=obj;

this._length=(function(info){

var l=0;

for(var item in info._coll)

{

info.Item[l]=info[l]=info._coll[item];

l++;

}

return l;

})(this);

}

return obj;

});

return info;

}

/******************************** Object Class:

\********************************/

function classWebService(wsi)

{

for(var i=0;i<wsi.CollWebMethodInfo.Length;i++)

{

var wmi=wsi.CollWebMethodInfo.Item(i);

if( wmi.Name=="toString"

||wmi.Name=="valueOf"

||wmi.Name=="prototype"

||wmi.Name=="constructor"

||wmi.Name=="__webserviceinfo__"

)

ThrowError("WebMethod的名字不能够为"+wmi.Name);

this[wmi.Name]=wmi.Create(this);

}

this["__webserviceinfo__"]=wsi;

}

function classWebServiceInfo(wsdl,wsname)

{

ASSERT(IsCalledByNew(this),"classWebServiceInfo:只用new 来调用");

ASSERT(""!=wsname,"classWebServiceInfo:wsname=>"+wsname);

//用于new JScriptSoapClient(...).createWebService(name)

this.Name=wsname;

//这个版本只能使用SOAP协议,如果为false,

//那么JScriptSoapClient(...).createWebService(name)抛出异常

this.SupportSoap=false;

this.Url=null;

this.CollWebMethodInfo=InfoCollection();

this._wsdl=wsdl;

this.Create=(function(){

if(false==this.SupportSoap)

ThrowError("WebService:"+this.Name+"不支持SoapHttp");

return new classWebService(this);

});

}

function classWebMethodInfo(wsi,wmname)

{

ASSERT(IsCalledByNew(this),"classWebMethodInfo:只用new 来调用");

ASSERT(""!=wmname,"classWebMethodInfo:wmname=>"+wmname);

this.Name=wmname;

this.SoapAction="";

this.IsUsable=true;

this.CollParamInInfo=InfoCollection();

this.CollParamOutInfo=InfoCollection();

this._wsi=wsi;

this.Create=(function(ws){

if(false==this.IsUsable)

ThrowError("WebMethod:"+this.Name+" 不可用\n不支持传输的数据类型");

var func=(function(){

var fself=fs();

return fself._Invoke(fself._ws,fself._wmi,fself.arguments);

});

func._ws=ws;

func._wmi=this;

func._Invoke=(function(ws,wmi,args){

/**************************************************************** ++Invoke++Invoke++Invoke++Invoke++Invoke++Invoke++Invoke++Invoke++

\****************************************************************/

var wsi=ws.__webserviceinfo__;

if(wmi.CollParamInInfo.Length!=args.length)

ThrowError("WebMethod:"+wmi.Name+"调用错误\n需要"+wmi.CollParamInInfo.Length+"个参数");

var username=wsi._wsdl._username;

var password=wsi._wsdl._password;

var url=wsi.Url;

var soapAction=wmi.SoapAction;

var xd=new ActiveXObject("Microsoft.XMLDOM");

xd.loadXML(

'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

xmlns:soap="'http://schemas.xmlsoap.org/soap/envelope/">

<soap:Body></soap:Body></soap:Envelope>');

var body=xd.documentElement.firstChild;

var nwm=xd.createElement(wmi.InputName);

nwm.setAttribute("xmlns",wmi.XMLNS);

body.appendChild(nwm);

for(var i=0;i<wmi.CollParamInInfo.Length;i++)

{

var pii=wmi.CollParamInInfo.Item(i);

var np=xd.createElement(pii.Name);

np.text=SoapTypes.StringFromValue(args[i],pii.Type)+"";

nwm.appendChild(np);

}

var xh=new ActiveXObject("Microsoft.XMLHTTP");

xh.open("POST",url,false,username,password);

xh.setRequestHeader("Content-Type","text/xml; charset=UTF-8");

xh.setRequestHeader("SOAPAction",'"'+soapAction+'"');

xh.send('<?xml version="1.0" encoding="UTF-8"?>'+xd.xml);

xd=xh.responseXML;

if(xd.parseError.errorCode)

ThrowError("调用WebMethod发生错误:\n"+xd.parseError.reason);

body=xd.documentElement.firstChild;

if(body.firstChild.namespaceURI=="http://schemas.xmlsoap.org/soap/envelope/")

ThrowError(body.firstChild.selectSingleNode("faultstring").text);

var nwmr=body.selectSingleNode(wmi.OutputName);

ASSERT(null!=nwmr,"返回的XML中找不到"+wmi.OutputName);

var nsResult=nwmr.selectNodes("*");

ASSERT(nsResult.length==wmi.CollParamOutInfo.Length,"返回的个数和定义的个数不符合");

var ReturnValue=CollReturnValue();

for(var i=0;i<nsResult.length;i++)

{

var nResult=nsResult.item(i);

var param=wmi.CollParamOutInfo.Item(i);

var resValue=SoapTypes.ValueFromString(nResult.text,param.Type);

ReturnValue._add(ReturnValueInfo(param.Name,resValue,param.Type));

}

return ReturnValue;

/**************************************************************** --Invoke--Invoke--Invoke--Invoke--Invoke--Invoke--Invoke--Invoke--

\****************************************************************/

});

func.CreateCall=(function(){

var wm=fs()._wm;

return CreateFunctionOfAsyncCall(wm);

});

func.CreateCall._wm=func;

return func;

});

}

function classParamInfo(name,type)

{

this.Name=name;

this.Type=type;

//保留

this.Namespace="http://www.w3.org/2001/XMLSchema";

}

/******************************** Type Support:

\********************************/

function SoapTypes()

{

return new Array(

"string","boolean","int","float","double"

);

}

function SoapTypes.IsSupport(type)

{

var arr=SoapTypes();

for(var i=0;i<arr.length;i++)

{

if(arr[i]==type)

return true;

}

return false;

}

function SoapTypes.ValueFromString(str,t)

{

ASSERT("string"==typeof(str),"SoapTypes.ValueFromString:str不是string");

switch(t)

{

case "string":

return str;

case "int":

return parseInt(str);

case "float":

case "double":

return parseFloat(str);

case "boolean":

if(str.toLowerCase()=="false")return false;

if(str.toLowerCase()=="true")return true;

ThrowError("SoapTypes.ValueFromString:boolean类型错误,值为"+str);

}

}

function SoapTypes.StringFromValue(v,t)

{

if(v)

return v+"";

return "";

}

/******************************** Start:

\********************************/

ASSERT(null!=url,"参数错误:无效的WSDL url");

username?null:username=GetUndefined();

password?null:password=GetUndefined();

//令=JScriptSoapClient(url)和=new JScriptSoapClient(url)的效果一样

if(!IsCalledByNew(this))

{

return new (fs(fs))(url,username,password);

}

//ws=>this

var wsdl=new Object();

wsdl._url=url;

wsdl._username=username;

wsdl._password=password;

//1

//取得WSDL的XML文档

//不成功立刻抛出异常

try{

var xdWSDL=(function(url){

//Get XMLDOMDocument From URL

var xh=new ActiveXObject("Microsoft.XMLHTTP");

//注意没有权限时的exception

xh.open("GET",wsdl._url,false,wsdl._username,wsdl._password);

xh.send();

var xd=xh.responseXML;

if(xd.parseError.errorCode)

ThrowError(xd.parseError.reason);

if(null==xd.documentElement)

ThrowError("不能取得"+wsdl._url+"\n可能是没有足够的权限");

return xd;

})(url);

}

catch(x){

ThrowError(

"不能加载WSDL:\n"

+url+"\n\n详细的信息:\n"

+(x.message?x.message:x.description)

);

}

@if(@debug)

wsdl._xd=xdWSDL;

@end

//初始化NameSpace

(function(wsdl,xdWSDL){

var targetNamespace=xdWSDL.documentElement.getAttribute("targetNamespace");

ASSERT(""!=targetNamespace,"WSDL中没有定义targetNamespace");

var collNs={

target :targetNamespace,

wsdl :"http://schemas.xmlsoap.org/wsdl/",

soap :"http://schemas.xmlsoap.org/wsdl/soap/",

soaphttp :"http://schemas.xmlsoap.org/soap/http",

soapenc :"http://schemas.xmlsoap.org/soap/encoding/",

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

xsd :"http://www.w3.org/2001/XMLSchema"

};

wsdl._collNs=collNs;

var collPf=new Object();

wsdl._collPf=collPf;

for(var i in collNs)

{

var pf=GetXMLNSPrefix(xdWSDL.documentElement,collNs[i])

if(pf===null)continue;

collPf[i]=pf;

}

})(wsdl,xdWSDL);

//2

//生成createWebService的数据并放进wsdl中

(function(wsdl,xd){

//把xd的信息解析为WebServiceDefine

var icwsi=wsdl.CollWebServiceInfo=InfoCollection();

var nsSvc=xd.selectNodes("//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/"+GetNodeName(wsdl._collPf["wsdl"],"service"));

ASSERT(nsSvc.length>0,"WSDL中不包含WebService的描述");

for(var i=0;i<nsSvc.length;i++)

{// //definitions/service

var nSvc=nsSvc.item(i);

var wsname=nSvc.getAttribute("name");

ASSERT(null!=wsname,"nSvc.getAttribute(\"name\")返回"+wsname);

var wsi=icwsi._add(new classWebServiceInfo(wsdl,wsname));

var nsPort=nSvc.selectNodes("port");

for(var j=0;j<nsPort.length;j++)

{// //definitions/service/port

var nPort=nsPort.item(j);

var portName=nPort.getAttribute("name");

var portBinding=nPort.getAttribute("binding");

ASSERT(null!=portName,'nPort.getAttribute("name") = '+portName);

ASSERT(null!=portBinding,portName+':nPort.getAttribute("binding") = '+portBinding);

var nBinding=xd.selectSingleNode("//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/"+GetNodeName(wsdl._collPf["wsdl"],"binding")+"[@name$eq$'"+portName+"'&&@type$eq$'"+portBinding+"']");

ASSERT(null!=nBinding,"//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/"+GetNodeName(wsdl._collPf["wsdl"],"binding")+"[@name$eq$'"+portName+"'&&@type$eq$'"+portBinding+"']"+"返回null");

ASSERT(null!=nBinding.firstChild,"nBinding:"+portBinding+" .firstChild为空");

var nBindingSoap=nBinding.selectSingleNode(GetNodeName(wsdl._collPf["soap"],"binding"))

//暂时不支持HTTP GET 和 POST

if(null==nBindingSoap)continue;

ASSERT(wsdl._collNs["soaphttp"]==nBindingSoap.getAttribute("transport"),"<soap:binding>:transport:"+nBindingSoap.getAttribute("transport"));

var bindingName=nBinding.getAttribute("name");//==portName

var bindingType=nBinding.getAttribute("type");//==portBinding

ASSERT(TagNameToPrefix(bindingType)==wsdl._collPf["target"],"bindingType不符合.\n"+bindingType);

var portTypeName=TagNameToBaseName(bindingType);

var nPortAddr=nPort.selectSingleNode(GetNodeName(wsdl._collPf["soap"],"address"));

ASSERT(null!=nPortAddr,"port下没有定义soap:address");

var portUrl=nPortAddr.getAttribute("location");

ASSERT(""!=portUrl,"?portUrl?");

wsi.SupportSoap=true;

wsi.Url=portUrl;

var nsOp=nBinding.selectNodes("operation");

for(var k=0;k<nsOp.length;k++)

{// //definitions/binding/operation

//as web method

//BREAKPOINT('nsOp.item(k).getAttribute("name") = '+nsOp.item(k).getAttribute("name"));

var nOp=nsOp.item(k);

var nSoapOp=nOp.selectSingleNode(GetNodeName(wsdl._collPf["soap"],"operation"));

ASSERT(null!=nSoapOp,"找不到soap:operation");

ASSERT(

"literal"==

nOp.selectSingleNode(GetNodeName(wsdl._collPf["wsdl"],"input")+"/"+GetNodeName(wsdl._collPf["soap"],"body"))

.getAttribute("use"),

"还没有对非literal的情况进行处理"

);

var wmname=nOp.getAttribute("name");

ASSERT(""!=wmname,"Operation没有name");

var wmi=new classWebMethodInfo(wsi,wmname);;

wmi.XMLNS=wsdl._collNs["target"];

var wmaction=nSoapOp.getAttribute("soapAction");

ASSERT(""!=wmaction,"Operation没有name");

wmi.SoapAction=wmaction;

var nPortType=xd.selectSingleNode("//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/"+GetNodeName(wsdl._collPf["wsdl"],"portType")+"[@name$eq$'"+portTypeName+"']")

ASSERT(null!=nPortType);

var nPortOp=nPortType.selectSingleNode(GetNodeName(wsdl._collPf["wsdl"],"operation")+"[@name$eq$'"+wmname+"']");

ASSERT(null!=nPortOp);

var inputmessage=nPortOp.selectSingleNode(GetNodeName(wsdl._collPf["wsdl"],"input")+"/@message").nodeValue;

var outputmessage=nPortOp.selectSingleNode(GetNodeName(wsdl._collPf["wsdl"],"output")+"/@message").nodeValue;

var nInputMessage=xd.selectSingleNode("//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/message[@name$eq$'"+TagNameToBaseName(inputmessage)+"']");

var nOutputMessage=xd.selectSingleNode("//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/message[@name$eq$'"+TagNameToBaseName(outputmessage)+"']");

ASSERT(null!=nInputMessage,"没有找到"+"//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/message[@name$eq$'"+TagNameToBaseName(inputmessage)+"']");

ASSERT(null!=nOutputMessage,"没有找到"+"//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/message[@name$eq$'"+TagNameToBaseName(outputmessage)+"']");

var inputElementName=nInputMessage.selectSingleNode(GetNodeName(wsdl._collPf["wsdl"],"part")).getAttribute("element");

var outputElementName=nOutputMessage.selectSingleNode(GetNodeName(wsdl._collPf["wsdl"],"part")).getAttribute("element");

var nSchema=xd.selectSingleNode("//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/"+GetNodeName(wsdl._collPf["wsdl"],"types")+"/"+GetNodeName(wsdl._collPf["xsd"],"schema")+"[@targetNamespace$eq$'"+wsdl._collNs["target"]+"']");

ASSERT(null!=nSchema,"没有找到//"+GetNodeName(wsdl._collPf["wsdl"],"definitions")+"/"+GetNodeName(wsdl._collPf["wsdl"],"types")+"/"+GetNodeName(wsdl._collPf["xsd"],"schema")+"[@targetNamespace$eq$'"+wsdl._collNs["target"]+"']");

var nSchemaInput=nSchema.selectSingleNode(GetNodeName(wsdl._collPf["xsd"],"element")+"[@name$eq$'"+TagNameToBaseName(inputElementName)+"']");

var nSchemaOutput=nSchema.selectSingleNode(GetNodeName(wsdl._collPf["xsd"],"element")+"[@name$eq$'"+TagNameToBaseName(outputElementName)+"']");

ASSERT(null!=nSchemaInput,"没有找到"+GetNodeName(wsdl._collPf["xsd"],"element")+"[@name$eq$'"+TagNameToBaseName(inputElementName)+"']");

ASSERT(null!=nSchemaOutput,"没有找到"+GetNodeName(wsdl._collPf["xsd"],"element")+"[@name$eq$'"+TagNameToBaseName(outputElementName)+"']");

wmi.InputName=nSchemaInput.getAttribute("name");

wmi.OutputName=nSchemaOutput.getAttribute("name");

var nsInputSequence=nSchemaInput.selectNodes(GetNodeName(wsdl._collPf["xsd"],"complexType")+"/"+GetNodeName(wsdl._collPf["xsd"],"sequence")+"/"+GetNodeName(wsdl._collPf["xsd"],"element"));

for(var l=0;l<nsInputSequence.length;l++)

{

var nIS=nsInputSequence.item(l);

var pitype=nIS.getAttribute("type");

var pitypename=TagNameToBaseName(pitype);

var pitypepf=TagNameToPrefix(pitype);

if(false==SoapTypes.IsSupport(pitypename)||pitypepf!=wsdl._collPf["xsd"])

{

//暂时不支持更多的类型

wmi.IsUsable=false;

}

var opi=new classParamInfo(nIS.getAttribute("name"),pitypename);

wmi.CollParamInInfo._add(opi,true);

}

var nsOutputSequence=nSchemaOutput.selectNodes(GetNodeName(wsdl._collPf["xsd"],"complexType")+"/"+GetNodeName(wsdl._collPf["xsd"],"sequence")+"/"+GetNodeName(wsdl._collPf["xsd"],"element"));

for(var l=0;l<nsOutputSequence.length;l++)

{

var nOS=nsOutputSequence.item(l);

var potype=nOS.getAttribute("type");

var potypename=TagNameToBaseName(potype);

var potypepf=TagNameToPrefix(potype);

if(false==SoapTypes.IsSupport(potypename)||potypepf!=wsdl._collPf["xsd"])

{

//暂时不支持更多的类型

wmi.IsUsable=false;

}

var opo=new classParamInfo(nOS.getAttribute("name"),potypename);

wmi.CollParamOutInfo._add(opo,true);

}

wsi.CollWebMethodInfo._add(wmi)

}//k

}//j

}//i

})(wsdl,xdWSDL);

//

//CreateWebService方法

wsdl.CreateWebService=(function(name){

var wsdl=this;

var wsi=wsdl.CollWebServiceInfo.Item(name);

if(wsi==null)ThrowError("没有这个Service:"+name);

return wsi.Create();

});

//返回

for(var propt in wsdl)

{

this[propt]=wsdl[propt];

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有