Lostinet作品:JScriptSoapClientv0.20Beta简单地异步调用你的WebService

// http://lostinet.d2g.com/Lostinet-Publish/JScriptSoapClient/
/****************************************************************/ 
<lostinet:source xmlns:lostinet="http://www.lostinet.com/lostinet-source/">
 <lostinet:source-info>
  <lostinet:name>JScriptSoapClient For .Net</lostinet:name>
  <lostinet:version>0.203</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
作者:迷失网络[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

/****************************************************************/ 
++++JScript+Operation+++JScript+Operation+++JScript+Operation+++++
/****************************************************************/
function GetUndefined(){}
function IsUndefined(unknown){
 return typeof(unknown)=="undefined";
}
function typeOf(unknown){
 return typeof(unknown);
}
function valueOf(unknown){
 if(IsUndefined(unknown))return GetUndefined();
 try{
  return unknown.valueOf();
 }catch(x){}
 return unknown;
}
function toString(unknown){
 if(IsUndefined(unknown))return "";
 if(unknown===null)return "";
 try{
  return unknown.toString();
 }catch(x){}
 return unknown+"";
}
function IsEqual(unknown1,unknown2){
 return unknown1==unknown2;
}
function IsIdentical(unknown1,unknown2){
 return unknown1===unknown2;
}
function Is(unknown){
 return unknown?true:false;
}
function Not(unknown){
 return unknown?false:true;
}
function IsNull(unknown){
 switch(typeOf(unknown))
 {
 case "undefined":return true;
 case "string":return unknown=="";
 case "number":return unknown==0;
 case "object":return unknown==null;
 case "function":return false;
 case "boolean":return unknown?false:true;
 default:return unknown?false:true;
 }
}
function IsBoolean(unknown){
 return typeOf(unknown)=="boolean";
}
function IsNumber(unknown){
 return typeOf(unknown)=="number";
}
function IsString(unknown){
 return typeOf(unknown)=="string";
}
function IsFunction(unknown){
 return typeOf(unknown)=="function";
}
function IsObject(unknown){
 return typeOf(unknown)=="object";
}
function IsJScriptObject(unknown)
{
 if(false==IsObject(unknown)&&false==IsFunction(unknown))return false;
 try{
  return IsFunction(unknown.constructor);
 }catch(x){
 }
 return false;
}
function VarValueOf(unknown){
 var arr=new Array();
 var unknown2=unknown;
 while(unknown=valueOf(unknown))
 {
  if(unknown2===unknown)return unknown;
  arr[arr.length]=unknown2;
  for(var i=0;i<arr.length;i++)
  {
   if(arr[i]===unknown)ThrowError("VarValueOf()检测到的valueOf环");
  }
  unknown2=unknown;
 }
}
function VarToString(unknown){
 return toString(VarValueOf(unknown));
}
function VarTypeOf(unknown){
 return typeOf(VarValueOf(unknown));
}
function VarIsEqual(unknown1,unknown2){
 return IsEqual(VarValueOf(unknown1),VarValueOf(unknown2));
}
function VarIsIdentical(unknown1,unknown2){
 return IsIdentical(VarValueOf(unknown1),VarValueOf(unknown2));
}
function VarIsNull(unknown){
 return IsNull(VarValueOf(unknown));
}
function VarIs(unknown){
 return VarValueOf(unknown)?true:false;
}
function VarNot(unknown){
 return VarValueOf(unknown)?false:true;
}
//下面的判断根据VarValueOf来进行。
//对变量进行属性操作前不要使用这些判断
//保留应用:对于以后的Delegate的扩充
function VarIsBoolean(unknown){
 return VarTypeOf(unknown)=="boolean";
}
function VarIsNumber(unknown){
 return VarTypeOf(unknown)=="number";
}
function VarIsString(unknown){
 return VarTypeOf(unknown)=="string";
}
function VarIsFunction(unknown){
 return VarTypeOf(unknown)=="function";
}
function VarIsObject(unknown){
 return VarTypeOf(unknown)=="object";
}
/****************************************************************/ 
----JScript-Operation---JScript-Operation---JScript-Operation-----
/****************************************************************/
function IsObjectPPT(name)
{
 ASSERT(IsString(name),"IsObjectPPT()参数错误");
 var arr=new Array("constructor","hasOwnProperty","instanceof","isPrototypeOf","length","prototype","propertyIsEnumeramble","toString","valueOf");
 for(var i=0;i<arr.length;i++)
  if(arr[i]==name)return true;
 return false;
}

function ThrowError(msg){
 throw(new Error(-1,msg));
}
@if(@debug)
function ASSERT(mustbetrue,msg){
 if(mustbetrue)return;
 msg?null:(msg="下面函数发生未指定错误:/m"+fs().caller);
 ThrowError("ASSERT - 发生错误:/n"+msg);
}
function BREAKPOINT(msg){
 msg?null:(msg=fs().caller);
 msg="BREAKPOINT,是否抛出异常?:/n"+msg;
 try{
  if(confirm(msg)==false)return;
 }catch(x){
 }
 ThrowError("BREAKPOINT抛出异常");
}
function ALERT(msg){
 try{
  window.alert(msg);
  return;
 }catch(x){}
 try{
  WScript.Echo(msg);
  return;
 }catch(x){}
}
@else
function ASSERT(mustbetrue,msg){}
function BREAKPOINT(msg){}
function ALERT(msg){}
@end
function fs(){return fs.caller}
function IsCalledByNew(_This){
 try{
  if(_This&&_This.constructor&&fs().caller==_This.constructor)
   return true;
 }catch(x){}
 return false;
}
//var1,var2,明确参数
function Delegate(var1,var2)
{
 if(IsCalledByNew(this))ThrowError("new Delegate()是不合法的调用方式");
 if(IsUndefined(var1))ThrowError("Delegate()参数无效");
 if(IsUndefined(var2)){
  ASSERT(IsFunction(var1),"Delegate的参数非function");
  return Delegate_Function(var1);
 }
 ASSERT(IsFunction(var1)||IsObject(var1),"Delegate的参数非object");
 if(IsString(var2)){
  ASSERT(IsObject(var1[var2])||IsFunction(var1[var2]),"Delegate的参数不是方法");
  return Delegate_Method(var1,var2);
 }
 else{
  ASSERT(IsJScriptObject(var1),"Delegate的参数非JScriptObject");
  ASSERT(IsFunction(var2),"Delegate的参数非function");
  return Delegate_VirtualMethod(var1,var2);
 }
 
 function Delegate_Function(func)
 {
  function Function(){
   if(IsNull(Function._Function))return;
   var arr=new Array();
   for(i=0;i<Function.arguments.length;i++)
    arr[arr.length]="Function.arguments["+i+"]";
   for(;i<Function._Arguments.length;i++)
    arr[arr.length]="Function._Arguments["+i+"]";
   var strArguments=arr.join(",");
   var strEval="Function._Function("+strArguments+")"
   strEval="var f=(function(){return "+strEval+"});f.Delegate=Function;f()";
   return eval(strEval);
  }
  function Function.valueOf(){return Function();}
  function Function.toString(){return Function();}
  function Function.PreInvoke(){
   Function._Arguments=new Array();
   Function.SetArguments(Function.PreInvoke.arguments);
   return Function;
  }
  function Function.SetArguments(args){
   for(var i=0;i<args.length;i++)
    Function._Arguments[i]=args[i];
   return Function;
  }
  function Function.Detach(){
   Function._Function=null;
   Function._Arguments=null;
  }
  Function._Function=func;
  Function._Arguments=new Array();
  return Function;
 }
 
 function Delegate_Method(obj,name)
 {
  function Function(){
   if(IsNull(Function._Object))return;
   var arr=new Array();
   for(i=0;i<Function.arguments.length;i++)
    arr[arr.length]="Function.arguments["+i+"]";
   for(;i<Function._Arguments.length;i++)
    arr[arr.length]="Function._Arguments["+i+"]";
   var strArguments=arr.join(",");
   var strEval="Function._Object."+Function._Name+"("+strArguments+")";
   strEval="var f=(function(){return "+strEval+"});f.Delegate=Function;f()";
   return eval(strEval);
  }
  function Function.valueOf(){return Function();}
  function Function.toString(){return Function();}
  function Function.PreInvoke(){
   Function._Arguments=new Array();
   Function.SetArguments(Function.PreInvoke.arguments);
   return Function;
  }
  function Function.SetArguments(args){
   for(var i=0;i<args.length;i++)
    Function._Arguments[i]=args[i];
   return Function;
  }
  function Function.Detach(){
   Function._Object=null;
   Function._Name="";
   Function._Arguments=null;
  }
  Function._Object=obj;
  Function._Name=name;
  Function._Arguments=new Array();
  return Function;
 }
 
 function Delegate_VirtualMethod(obj,func)
 {
  function Function(){
   if(IsNull(Function._Object))return;
   var arr=new Array();
   for(i=0;i<Function.arguments.length;i++)
    arr[arr.length]="Function.arguments["+i+"]";
   for(;i<Function._Arguments.length;i++)
    arr[arr.length]="Function._Arguments["+i+"]";
   var strArguments=arr.join(",");
   var ppt="DelegateVirtualMethod"+new Date().getTime()+"_"+Math.floor(Math.random()*1000000);
   Function._Object[ppt]=func;
   var res,error;
   var strEval="Function._Object."+ppt+"("+strArguments+")";
   strEval="var f=(function(){return "+strEval+"});f.Delegate=Function;f()";
   try{
    res=eval(strEval);
   }catch(x){
    error=x;
   }
   if(!IsNull(Function._Object))delete Function._Object[ppt];
   if(error)throw(error);
   return res;
  }
  function Function.valueOf(){return Function();}
  function Function.toString(){return Function();}
  function Function.PreInvoke(){
   Function._Arguments=new Array();
   Function.SetArguments(Function.PreInvoke.arguments);
   return Function;
  }
  function Function.SetArguments(args){
   for(var i=0;i<args.length;i++)
    Function._Arguments[i]=args[i];
   return Function;
  }
  function Function.Detach(){
   Function._Object=null;
   Function._Function=null;
   Function._Arguments=null;
  }
  Function._Object=obj;
  Function._Function=func;
  Function._Arguments=new Array();
  return Function;
 }
 
}
function Delegate.QueryDelegate()
{//小心objDelegate.valueOf()递归
 return fs().caller.caller.Delegate;
}
function JScriptSoapClient(wsdlurl,username,password,wsdlxml)
{
 function GetNodeName(prefix,baseName){
  ASSERT(IsString(baseName)&&!IsNull(baseName),"GetNodeName()参数错误");
  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);
 }
 function CreateDefaultCollection()
 {
  return FunctionSpace();
  function FunctionSpace()
  {
   var _Length=0;
   var _Coll=new Object();
   function Collection(index)
   {
    return Collection.Item(index);
   }
   function Collection.valueOf(){
    if(_Length==0)return GetUndefined();
    return VarValueOf(Collection.Item(0));
   }
   function Collection.toString(){
    return VarToString(Collection.valueOf());
   }
   function Collection.Length(){return _Length;}
   function Collection.Length.valueOf(){
    return Collection.Length();
   }
   function Collection.Length.toString(){
    return Collection.Length();
   }
   function Collection.Item(index){
    ASSERT(index<_Length||IsNull(_Coll[index])==false,"找不到Item:"+index);
    if(!IsNumber(index))return _Coll[index];
    var pos=0;
    for(var ppt in _Coll){
     if(pos==index)return _Coll[ppt];
     pos++;
    }
    ASSERT(0,"CreateDefaultCollection::Collection.Item : 不能到达");
   }
   function Collection._add(obj){
    ASSERT(IsJScriptObject(obj)&&IsString(obj.Name),"CreateDefaultCollection::Collection._add : 参数错误");
    ASSERT(obj.Name!=parseInt(obj.Name),"CreateDefaultCollection::Collection._add : obj.Name 不能为数字");
    if(IsJScriptObject(_Coll[obj.Name]))return true;
    _Coll[obj.Name]=obj;
    _Length++;
    return true;
   }
   return Collection;
  }
 }
 ASSERT( (!IsNull(wsdlxml)) || (!IsNull(wsdlurl)) ,"JScriptSoapClient参数错误");
 username?null:username=GetUndefined();
 password?null:password=GetUndefined();
 if(!IsCalledByNew(this))
  return new (fs())(wsdlurl,username,password,wsdlxml);
 return CreateSoapClient();
 function CreateSoapClient()
 {
  var CurrentSoapClient=new Object();
  CurrentSoapClient.CollWebServiceInfo=CreateDefaultCollection();
  CurrentSoapClient.URL=wsdlurl;
  CurrentSoapClient.UserName=username;
  CurrentSoapClient.Password=password;
  
  var xdWSDL=null;
  while(1)
  {
   try{
    if(!IsNull(wsdlxml))
    {
     xdWSDL=new ActiveXObject("Microsoft.XMLDOM");
     xdWSDL.loadXML(wsdlxml);
     if(xdWSDL.parseError.errorCode)
      ThrowError(xdWSDL.parseError.reason);
     break;
    }
    xdWSDL=(function(){
     var xh=new ActiveXObject("Microsoft.XMLHTTP");
     xh.open("GET",wsdlurl,false,username,password);
     xh.send();
     var xd=xh.responseXML;
     if(xd.parseError.errorCode)
      ThrowError(xd.parseError.reason);
     if(IsNull(xd.documentElement))
      ThrowError("不能取得"+wsdlurl+"/n可能是没有足够的权限");
     return xd;
    })();
    break;
   }catch(x){
    ThrowError(
     "不能加载WSDL:/n"
     +wsdlurl+"/n/n详细的信息:/n"
     +(x.message?x.message:x.description)
     );
   }
  }
  CurrentSoapClient.XMLNS=xdWSDL.documentElement.getAttribute("targetNamespace");
  var collNs={
   target  :CurrentSoapClient.XMLNS,
   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"
  };
  var collPf=new Object();
  for(var i in collNs){
   var pf=(function(de,ns){
    var nsAttr=de.attributes;
    for(var i=0;i<nsAttr.length;i++){
     var nAttr=nsAttr.item(i);
     if(nAttr.prefix=="xmlns"&&nAttr.nodeValue==ns)
      return nAttr.baseName;
     if(nAttr.prefix==""&&nAttr.baseName=="xmlns"&&nAttr.nodeValue==ns)
      return "";
    }
    return null;
   })(xdWSDL.documentElement,collNs[i]);
   if(pf===null)continue;
   collPf[i]=pf;
  }
  var xdrootpath="//"+GetNodeName(collPf["wsdl"],"definitions")+"/";
  var nsService=xdWSDL.selectNodes(xdrootpath+GetNodeName(collPf["wsdl"],"service"));
  ASSERT(nsService.length>0,"WSDL中不包含WebService的描述");
  var nService;
  for(var i=0;i<nsService.length;i++)
  {
   nService=nsService.item(i);
   CurrentSoapClient.CollWebServiceInfo._add(CreateWebServiceInfo());
  }
  delete nService;delete nsService;delete i;delete xdrootpath;
  @if(@debug==false)
  delete xdWSDL;
  @end
  CurrentSoapClient.CreateWebService=(function(name){
   ASSERT(IsString(name),"CreateWebService()参数无效");
   var wsi=CurrentSoapClient.CollWebServiceInfo.Item(name);
   if(IsNull(wsi))ThrowError("找不到WebService:"+name);
   return wsi.Create();
  });
  return CurrentSoapClient;
  function CreateWebServiceInfo()
  {
   //stack var CurrentWebServiceInfo
   var CurrentWebServiceInfo=new Object();
   CurrentWebServiceInfo.CollWebMethodInfo=CreateDefaultCollection();
   CurrentWebServiceInfo.Name=nService.getAttribute("name");
   CurrentWebServiceInfo.IsUsable=false;
   CurrentWebServiceInfo.UnusableReason+="WebService不支持soaphttp";
   var nsPort=nService.selectNodes("port");
   var nPort,port_name,port_binding,nBinding,nBindingSoap,port_binding_name,
    nPortAddress,port_address_location,
    nsOperation,nOperation,nOperationSoap;
   for(var i=0;i<nsPort.length;i++)
   {
    nPort=nsPort.item(i);
    port_name=nPort.getAttribute("name");
    port_binding=nPort.getAttribute("binding");
    nBinding=xdWSDL.selectSingleNode(xdrootpath+GetNodeName(collPf["wsdl"],"binding")+"[@name$eq$'"+port_name+"'&&@type$eq$'"+port_binding+"']");
    nBindingSoap=nBinding.selectSingleNode(GetNodeName(collPf["soap"],"binding"));
    if(IsNull(nBindingSoap))continue;
    ASSERT(collNs["soaphttp"]==nBindingSoap.getAttribute("transport"),"nBindingSoap的transport不为"+collNs["soaphttp"]);
    port_binding_name=TagNameToBaseName(port_binding);
    nPortAddress=nPort.selectSingleNode(GetNodeName(collPf["soap"],"address"));
    port_address_location=nPortAddress.getAttribute("location");
    CurrentWebServiceInfo.IsUsable=true;
    CurrentWebServiceInfo.UnusableReason="";
    CurrentWebServiceInfo.URL=port_address_location;
    nsOperation=nBinding.selectNodes("operation");
    for(var j=0;j<nsOperation.length;j++)
    {
     nOperation=nsOperation.item(j);
     nOperationSoap=nOperation.selectSingleNode(GetNodeName(collPf["soap"],"operation"));
     ASSERT(
      "literal"==
      nOperation.selectSingleNode(GetNodeName(collPf["wsdl"],"input")+"/"+GetNodeName(collPf["soap"],"body"))
      .getAttribute("use"),
      "还没有对非literal的情况进行处理"
      );
     CurrentWebServiceInfo.CollWebMethodInfo._add(CreateWebMethodInfo());
    }
   }
   delete nsPort;delete i;delete nPort;delete port_name;delete port_binding;
   delete nBinding;delete nBindingSoap;delete port_binding_name;
   delete nPortAddress;delete port_address_location;delete j;
   delete nsOperation;delete nOperation;delete nOperationSoap;
   CurrentWebServiceInfo.Create=(function(){
    if(!CurrentWebServiceInfo.IsUsable)
     ThrowError("WebService:"+CurrentWebServiceInfo.Name+"不能被创建/n"+CurrentWebServiceInfo.UnusableReason);
    var WebService=new Object();
    for(var i=0;i<CurrentWebServiceInfo.CollWebMethodInfo.Length;i++)
    {
     var wmi=CurrentWebServiceInfo.CollWebMethodInfo.Item(i);
     if(IsObjectPPT(wmi.Name))
     {
      BREAKPOINT("WebMethod的名字"+wmi.Name+"和JScript的对象属性名冲突/n该WebMethod不被创建");
      continue;
     }
     WebService[wmi.Name]=wmi.Create();
    }
    return WebService;
   });
   return CurrentWebServiceInfo;
   function CreateWebMethodInfo()
   {
    var CurrentWebMethodInfo=new Object();
    CurrentWebMethodInfo.CollParamInInfo=CreateDefaultCollection();
    CurrentWebMethodInfo.CollParamOutInfo=CreateDefaultCollection();
    CurrentWebMethodInfo.Name=nOperation.getAttribute("name");
    CurrentWebMethodInfo.XMLNS=
    CurrentWebMethodInfo.SoapAction=nOperationSoap.getAttribute("soapAction");
    CurrentWebMethodInfo.IsUsable=true;
    CurrentWebMethodInfo.UnusableReason="";
    var nPortType=xdWSDL.selectSingleNode(xdrootpath+GetNodeName(collPf["wsdl"],"portType")+"[@name$eq$'"+port_binding_name+"']");
    var nPortTypeOperation=nPortType.selectSingleNode(GetNodeName(collPf["wsdl"],"operation")+"[@name$eq$'"+CurrentWebMethodInfo.Name+"']");
    var message_input=nPortTypeOperation.selectSingleNode(GetNodeName(collPf["wsdl"],"input")).getAttribute("message");
    var message_output=nPortTypeOperation.selectSingleNode(GetNodeName(collPf["wsdl"],"output")).getAttribute("message");
    var nMessageInput=xdWSDL.selectSingleNode(xdrootpath+GetNodeName(collPf["wsdl"],"message")+"[@name$eq$'"+TagNameToBaseName(message_input)+"']");
    var nMessageOutput=xdWSDL.selectSingleNode(xdrootpath+GetNodeName(collPf["wsdl"],"message")+"[@name$eq$'"+TagNameToBaseName(message_output)+"']");
    var element_input=nMessageInput.selectSingleNode(GetNodeName(collPf["wsdl"],"part")).getAttribute("element");
    var element_output=nMessageOutput.selectSingleNode(GetNodeName(collPf["wsdl"],"part")).getAttribute("element");
    var nSchema=xdWSDL.selectSingleNode(xdrootpath+GetNodeName(collPf["wsdl"],"types")+"/"+GetNodeName(collPf["xsd"],"schema")+"[@targetNamespace$eq$'"+collNs["target"]+"']");
    var nSchemaInput=nSchema.selectSingleNode(GetNodeName(collPf["xsd"],"element")+"[@name$eq$'"+TagNameToBaseName(element_input)+"']");
    var nSchemaOutput=nSchema.selectSingleNode(GetNodeName(collPf["xsd"],"element")+"[@name$eq$'"+TagNameToBaseName(element_output)+"']");
    CurrentWebMethodInfo.NameInput=nSchemaInput.getAttribute("name");
    CurrentWebMethodInfo.NameOutput=nSchemaOutput.getAttribute("name");
    var nsInputSequence=nSchemaInput.selectNodes(GetNodeName(collPf["xsd"],"complexType")+"/"+GetNodeName(collPf["xsd"],"sequence")+"/"+GetNodeName(collPf["xsd"],"element"));
    var nSequence;
    for(var i=0;i<nsInputSequence.length;i++)
    {
     nSequence=nsInputSequence.item(i);
     CurrentWebMethodInfo.CollParamInInfo._add(CreateParamInfo());
    }
    var nsOutputSequence=nSchemaOutput.selectNodes(GetNodeName(collPf["xsd"],"complexType")+"/"+GetNodeName(collPf["xsd"],"sequence")+"/"+GetNodeName(collPf["xsd"],"element"));
    for(var i=0;i<nsOutputSequence.length;i++)
    {
     nSequence=nsOutputSequence.item(i);
     CurrentWebMethodInfo.CollParamOutInfo._add(CreateParamInfo());
    }
    if(CurrentWebMethodInfo.IsUsable==false)
    {
     CurrentWebServiceInfo.IsUsable=false;
     CurrentWebServiceInfo.UnusableReason+="/n["+CurrentWebServiceInfo.Name+":"+CurrentWebMethodInfo.UnusableReason+"]";
    }
    delete nPortType;delete nPortTypeOperation;delete message_input;delete message_output;
    delete nMessageInput;delete nMessageOutput;delete element_input;delete element_output;
    delete nSchema;delete nSchemaInput;delete nSchemaOutput;
    delete nsInputSequence;delete nsOutputSequence;delete nSequence;delete i;
    CurrentWebMethodInfo.Create=(function(){
     return FunctionSpace();
     function FunctionSpace()
     {
      function InnerCreateCall(a){
       return FunctionSpace();
       function FunctionSpace()
       {
        var async=a;
        var isReady=a?false:true;
        var isCalled=false;
        var xh=new ActiveXObject("Microsoft.XMLHTTP");
        xh.onreadystatechange=onreadystatechange;
        var xdr=new ActiveXObject("Microsoft.XMLDOM");
        function onreadystatechange(){
         if(xh.readyState!=4)return;
         if(isReady==false)RecieveData();
        }
        function RecieveData()
        {
         isReady=true;
         xdr.loadXML(xh.responseXML.xml);
         xh=null;
         AsyncCall.onready(AsyncCall);
        }
        function Send(args){
         if(CurrentWebMethodInfo.CollParamInInfo.Length!=args.length)
          ThrowError(CurrentWebMethodInfo.Name+":调用错误/n只能是"+CurrentWebMethodInfo.CollParamInInfo.Length+"个参数");
         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 nwm=xd.createElement(CurrentWebMethodInfo.NameInput);
         nwm.setAttribute("xmlns",CurrentSoapClient.XMLNS);
         xd.documentElement.firstChild.appendChild(nwm);
         for(var i=0;i<CurrentWebMethodInfo.CollParamInInfo.Length;i++)
         {
          var ParamInfo=CurrentWebMethodInfo.CollParamInInfo.Item(i);
          var np=xd.createElement(ParamInfo.Name);
          np.text=ParamInfo.CreateFromValue(args[i]).String;
          nwm.appendChild(np);
         }
         try{
          xh.open("POST",CurrentWebServiceInfo.URL,async,CurrentSoapClient.UserName,CurrentSoapClient.Passwrod);
         }catch(x){
          ThrowError("调用WebMethod:"+CurrentWebMethodInfo.Name+"失败/n"+x.description);
         }
         xh.setRequestHeader("Content-Type","text/xml; charset=UTF-8");
         xh.setRequestHeader("SOAPAction",'"'+CurrentWebMethodInfo.SoapAction+'"');
         xh.send('<?xml version="1.0" encoding="UTF-8"?>'+xd.xml);
         isCalled=true;
         if(async==false)RecieveData();
         return AsyncCall;
        }
        function Get(){
         if(xdr.parseError.errorCode)
          ThrowError("调用WebMethod:"+CurrentWebMethodInfo.Name+"返回错误");
         var body=xdr.documentElement.firstChild;
         if(body.firstChild.namespaceURI=="http://schemas.xmlsoap.org/soap/envelope/")
          ThrowError(body.firstChild.selectSingleNode("faultstring").text);
         var nsResult=body.selectSingleNode(CurrentWebMethodInfo.NameOutput).selectNodes("*");
         var CollReturnValue=CreateDefaultCollection();
         for(var i=0;i<nsResult.length;i++)
         {
          var nResult=nsResult.item(i);
          var ParamInfo=CurrentWebMethodInfo.CollParamOutInfo.Item(i);
          CollReturnValue._add(ParamInfo.CreateFromString(nResult.text));
         }
         return CollReturnValue;
        }
        
        function AsyncCall(){
         return AsyncCall.Invoke(AsyncCall.arguments);
        }
        function AsyncCall.GetWebMethod(){
         return Method;
        }
        function AsyncCall.Call(){
         return AsyncCall.Invoke(AsyncCall.Call.arguments);
        }
        function AsyncCall.valueOf(){
         return AsyncCall.toString();
        }
        function AsyncCall.toString(){
         return "[WebMethod(Name=/""+CurrentWebMethodInfo.Name+"/")]";
        }
        function AsyncCall.IsReady(){
         return isReady;
        }
        function AsyncCall.IsReady.valueOf(){return  AsyncCall.IsReady();}
        function AsyncCall.IsReady.toString(){return  AsyncCall.IsReady();}
        function AsyncCall.Invoke(args){
         if(async)
         {
          if(isCalled)ThrowError("Async Call 对象只能使用一次");
          return Send(args);
         }
         Send(args);
         return Get();
        }
        function AsyncCall.GetResult(){
         if(isReady==false)ThrowError(CurrentWebMethodInfo.Name+":结果还没有返回");
         return Get();
        }
        function AsyncCall.onready(objCall){}
        return AsyncCall;
       }
      }
      function Method(){
       return InnerCreateCall(false).Invoke(Method.arguments);
      }
      function Method.valueOf(){
       return Method.toString();
      }
      function Method.toString(){
       return "[WebMethod(Name=/""+CurrentWebMethodInfo.Name+"/")]";
      }
      function Method.CreateCall()
      {
       return InnerCreateCall(true);
      }
      return Method;
     };
    });
    return CurrentWebMethodInfo;
    function CreateParamInfo()
    {
     var CurrentParamInfo=new Object();
     CurrentParamInfo.Name=nSequence.getAttribute("name");
     CurrentParamInfo.Type=TagNameToBaseName(nSequence.getAttribute("type"));
     CurrentParamInfo.TypeNS=(function(){
      var prefix=TagNameToPrefix(nSequence.getAttribute("type"));
      for(var i in collPf)
      {
       if(collPf[i]==prefix)return collNs[i];
      }
      //ThrowError("前缀"+prefix+"找不到名字空间");
      return toString(xdWSDL.documentElement.getAttribute("xmlns:"+prefix));
     })();
     
     if(CurrentParamInfo.TypeNS!=collNs["xsd"])
     {
      CurrentWebMethodInfo.IsUsable=false;
      CurrentWebMethodInfo.UnusableReason+="["+CurrentWebMethodInfo.Name+":"+CurrentParamInfo.Name+"不支持的数据类型namespace:"+CurrentParamInfo.TypeNS+"]";
     }
     (function(){
      var arr=new Array("string","boolean","int","float","double");
      for(var i=0;i<arr.length;i++)
      {
       if(arr[i]==CurrentWebMethodInfo.Type)
        return;
      }
      CurrentWebMethodInfo.IsUsable=false;
      CurrentWebMethodInfo.UnusableReason+="["+CurrentWebMethodInfo.Name+":"+CurrentParamInfo.Name+"不支持的数据类型:"+CurrentWebMethodInfo.Type+"]";
     });
     CurrentParamInfo.ValueFromString=(function(v){
      ASSERT("string"==typeof(v),"SoapTypes.ValueFromString:str不是string");
      /*
      checking...CurrentParamInfo.TypeNS
      ...nothing to check now...
      */
      switch(CurrentParamInfo.Type)
      {
      case "string":
       return v;
      case "int":
       return parseInt(v);
      case "float":
      case "double":
       return parseFloat(v);
      case "boolean":
       if(v.toLowerCase()=="false")return false;
       if(v.toLowerCase()=="true")return true;
      default:
       ThrowError("SoapTypes.ValueFromString:boolean类型错误,值为"+v);
      }
     });
     CurrentParamInfo.StringFromValue=(function(v){
      if(IsNull(v))return "";
      return VarToString(v);
     });
     CurrentParamInfo.CreateFromString=(function(v){
      return CreateParam(true,v);
     });
     CurrentParamInfo.CreateFromValue=(function(v){
      return CreateParam(false,v);
     });
     function CreateParam(bystring,v)
     {
      var param=new Object();
      param.Name=CurrentParamInfo.Name;
      param.Type=CurrentParamInfo.Type;
      param.TypeNS=CurrentParamInfo.TypeNS;
      if(bystring){
       param.String=v;
       param.Value=CurrentParamInfo.ValueFromString(v);
      }
      else{
       param.Value=v;
       param.String=CurrentParamInfo.StringFromValue(v);
      }
      param.valueOf=(function(){
       return param.Value;
      });
      param.toString=(function(){
       return param.String;
      });
      return param;
     }
     return CurrentParamInfo;
    }
   }
  }
 }
}
function JScriptSoapClient.valueOf(){
 return JScriptSoapClient.toString();
}
function JScriptSoapClient.toString(){
 return "JScriptSoapClient 0.20 Beta By http://www.lostinet.com";
}
function JScriptSoapClient.AsyncLoad(func,url,username,password)
{
 ASSERT(IsFunction(func),"AsyncLoadJScriptSoapClient:参数无效");
 ASSERT(IsString(url),"AsyncLoadJScriptSoapClient:参数无效");
 var idLoad=new Date().getTime()*1000000+Math.floor(Math.random()*1000000)
 var xh=new ActiveXObject("Microsoft.XMLHTTP");
 xh.onreadystatechange=OnReadyStateChange;
 xh.open("GET",url,true,username,password);
 xh.send();
 function OnReadyStateChange()
 {
  if(xh.readyState!=4)return;
  var xd=xh.responseXML;
  if(xd.parseError.errorCode)
  {
   func(null,url,idLoad);
  }
  func(new JScriptSoapClient(url,username,password,xd.xml),url,idLoad);
  xh=null;
 }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值