Beyond the dream——飛雪飄寒

————磨難不過是人生鍵盤的回車。。。。。。
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

求“javascript调用Webservice”所遇问题的解答!

Posted on 2008-09-02 17:05  飛雪飄寒  阅读(4370)  评论(14编辑  收藏  举报

     最近在项目中需要使用javascript调用webservice,从中遇到了几个问题,如果哪位高手知道的话,麻烦帮忙解答一下。
     1、在网上找了好久,没找到webbehavior.htc文件的下载地址;
     2、如何解决javascript调用webservice的跨域问题;

下面是自己在网上收集整理的javascript调用webservice的实现方式: 

方法一、(自己实现,所遇问题:不能解决跨域的问题)

     当flag=SOAPClient.invoke("http://localhost/GZPI/PublicWebService/WriteGraduater.asmx" , "GetGraduaterPorcessInfo", pl, false) 时,调用没有任何问题; 
     当flag=SOAPClient.invoke("http://192.168.65.26/GZHR/WebServices/SYDWReturnDataService.asmx" , "ReceiveResult", pl, false)时,提示"没有权限"的错误!

  <script language="javascript" src="soapclient.js" charset="gb2312"></script>
  <script language="javascript" type="text/javascript"> 
  function UseWebServices()
  {
   var idcode="440523197209085275"; //身份证号
   var Isgz ="1";     //是否广州户口 公务员:是否广州市户口(0:是1:否) 事业单位:是否广州市户口(1:是2:否)
   var flag = false;
   var SysID=1;       //系统ID,1表示高校毕业生系统,2表示人才引进系统;
   if(Isgz=="1")
   {
    var pl = new SOAPClientParameters();
    pl.add("user", {UserName:"gwy@900001",Password:"123456"} );
    pl.add("idcode",idcode);    
    flag=SOAPClient.invoke("http://172.16.128.84:8089/GZPI/PublicWebService/WriteGraduater.asmx" , "GetGraduaterPorcessInfo", pl, false);      
    if(flag==false)
    {
     SysID=2;
     flag=SOAPClient.invoke("http://172.16.128.84:8089/GZPI/PublicWebService/WritePerson.asmx" , "GetGraduaterPorcessInfo", pl, false);      
    }
    alert(flag);
    if(flag==true)
    {
     if(SysID==1)
     {
      return confirm('该人员已在高校毕业生系统中申报,是否继续?');
     }
     else
     {
      return confirm('该人员已在人才引进系统中申报,是否继续?');
     }
    }
   }
          }
  function WebServices()
  {
    var reply
    var flag=false;
    var pl = new SOAPClientParameters();
    pl.add("ID","111111" );
    pl.add("Result","成功");
    //pl.add("Reply",reply);    
    flag=SOAPClient.invoke("http://192.168.65.26/GZHR/WebServices/SYDWReturnDataService.asmx" , "ReceiveResult", pl, false);      
    alert(flag); 
    //alert(reply);
    alert(pl[1]);
          }         
  </script>

soapclient.js

方法二、(网上搜集,所遇问题:未能下载到webbehavior.htc文件)     

1 、首先,要创建一个webservice,比如

<%@ WebService Language="C#" class=MyMath %>
using System;
using System.Web.Services;
public class MyMath {
[WebMethod]
public int add(int a, int b)
{
return a + b;
}
[WebMethod]
public int subtract(int a, int b)
{
return a - b;
}
}
然后发布,先得到其wsdl。
2、首先,我们要下载webbehavior.htc这个文件(可以到http://msdn.microsoft.com/downloads/samples/internet/behaviors/library/webservice/default.asp.)
下载,然后放到你的web当前目录下
然后在要调用webserice的页面中,修改如下
<body>
<div id="addservice" style="behavior:url(webservice.htc)"></div>
</body>
这里我们将div id命名为有意义的名称,并且指定style为 webservice行为。接着,我们要书写javascript来调用webserice了:
首先,我们在javascript中,调用其wsdladdservice.useService("http://localhost/services/math.asmx?WSDL","MyMath");
使用id.useService(WSDLL路径,简单的命名方式);
我们之前设定的id是addservice,而为了给客户端调用方便,我们这里起了名称,叫MyMath。而为了保证能正确调用webserice,必须在body里的onload事件里,马上加载处理webservice调用的javascript,如下
<script language="JavaScript">
function init()
{
addservice.useService("http://localhost/services/math.asmx?WSDL","MyMath"); }
</script>
<body onload="init()">
<div id="service" style="behavior:url(webservice.htc)">
</div>
</body>
 
 在上面,我们通过webservice行为,首先得到了返回webservice的wsdl,接下来我们要进行调用了,调用的格式如下:   iCallID = id.FriendlyName.callService([CallbackHandler,] "MethodName",  Param1, Param2, ...);
这里id是我们在div里设置的id,而FridndbyName是我们刚才为方面而起的命,这里就是MyMath了,而CallbackHandler是使用回调函数的过程名,如果无设置的话,则默认是使用onresult所调用的方法来进行处理,下文会讲到,而param1,,param2等则是说传入的参数了,如:
<SCRIPT language="JavaScript">
// All these variables must be global,
// because they are used in both init() and onresult().
var iCallID = ;
var intA = 5;
var intB = 6;
function init()
{
// Establish the friendly name "MyMath" for the WebServiceURL
service.useService("/services/math.asmx?WSDL","MyMath");
// The following method doesn't specify a callback handler, so onWSresult() is used
iCallID = service.MyMath.callService("add", intA, intB);
}
function onWSresult()
{
// if there is an error, and the call came from the call() in init()
if((event.result.error)&&(iCallID==event.result.id))
{
// Pull the error information from the event.result.errorDetail properties
var xfaultcode   = event.result.errorDetail.code;
var xfaultstring = event.result.errorDetail.string;
var xfaultsoap   = event.result.errorDetail.raw;
// Add code to handle specific error codes here
}
// if there was no error, and the call came from the call() in init()
else if((!event.result.error) && (iCallID == event.result.id))
{
// Show the arithmetic!
alert(intA + ' + ' + intB + ' = ' + event.result.value);
}
else
{
alert("Something else fired the event!");
}
}
</SCRIPT>
<body onload="init()">
<div id="service" style="behavior:url(webservice.htc)" onresult="onWSresult()">
</div>
</body>
 
注意,用onresult方式返回的话,要在div部分的onresult中指定处理的方法,这里是用onWsresult()方法,其中根据返回的信息来判断是否出错,出错的话则显示。   
  如果用回调的话,则如下处理
<SCRIPT language="JavaScript">
// All these variables must be global,
// because they are used in both init() and onResult().
var iCallID = ;
var intA = 5;
var intB = 6;
function init()
{
// Establish the friendly name "MyMath" for the WebServiceURL
service.useService("/services/math.asmx?WSDL","MyMath");
// The following uses a callback handler named "mathResults"
iCallID = service.MyMath.callService(mathResults, "add", intA, intB);
}
function mathResults(result)
{
// if there is an error, and the call came from the call() in init()
if(result.error)
{
// Pull the error information from the event.result.errorDetail properties
var xfaultcode   = result.errorDetail.code;
var xfaultstring = result.errorDetail.string;
var xfaultsoap   = result.errorDetail.raw;
// Add code to handle specific error codes here
}
// if there was no error
else
{
// Show the arithmetic
alert(intA + ' + ' + intB + " = " + result.value);
}
}
</SCRIPT>
<body onload="init()">
<div id="service" style="behavior:url(webservice.htc)">
</div>
</body>

信息来源:http://www.cnblogs.com/xiaobaidhg/articles/681284.html