这个问题几天了,麻烦高手们帮我看下,非常感谢!
问题描述:
我的webservice用的是Axis 1.0,架设的时候,就是把Axis文件夹放到相应的tomcat安装目录的webapps目录下。
1.修改了tomcat的server.xml文件,将webservice服务器端项目路径部署到了tomcat里面,部分代码如下:
- XML code
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context displayName="tjsoft Struts Application" docBase="E:\wllWorkspace\tdServer\public_html" path="" reloadable="true"></Context>
2.webservice里面的server-config.wsdd文件是我自己加上的,不是它自动生成的,因为每次按照网上的方法生成都不成功,部分代码如下:
- XML code
<service name="TongdaoWs" provider="java:RPC"><parameter name="className" value="com.sendServer.TongdaoWs"/><parameter name="allowedMethods" value="*"/></service>
3.启动tomcat,访问我发布的webservice:
http://192.168.1.136:8080/Axis/services/TongdaoWs
可以成功。(不能上图,我把访问出来的页面发在下面,但是有个小问题,问题1:为什么这样访问,不能显示我发布在TongdaoWs的里面的方法,而要在访问的url后面加上?wsdl才能看到里面的方法,还是本来就是这样的?)
TongdaoWs
Hi there, this is an AXIS service!
Perhaps there will be a form for invoking the service here...
4.客户端调用我发布的webservice,部分代码如下(调用时,需要传递一个mianid参数进去,测试过,这个mainid在程序中是可以获取的):
- Java code
public void invokeTd(String mainid){ try { String url = "http://192.168.1.136:8080/Axis/services/TongdaoWs"; Service serv = new Service(); Call call = (Call) serv.createCall(); call.setTargetEndpointAddress(url); System.out.println("1"); call.setOperationName(new QName(url, "invokeWg")); System.out.println("2"); call.invoke(new Object[] { mainid }); System.out.println("3"); //call.setOperationName(new QName(url, "Test")); //System.out.println("4"); System.out.println("通道成功!!"); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
如上:
运行出来的结果是:
1
2
3和“通道成功!!”都没有打印出来,说明那个传mainid的地方根本就没有执行,但是也不报错,但是mainid打印出来过,是有值的。所以我怀疑是传递参数的问题,于是做了另外一个实验,还是上面的代码,在webservice服务器端又写了一个不传参数的最简单的Test方法,就是上面被注释掉的。Test方法会打印一句话"通道是好的!!!!只是不能传参数"。
现在假定把上面代码的
System.out.println("1");
call.setOperationName(new QName(url, "invokeWg"));
System.out.println("2");
call.invoke(new Object[] { mainid });
这4句话(也就是调用invokeWg(String mainid))的这个方法注释掉了,客户端只调用无参的,可以打印语句的Test()方法,输出结果是:
3
4
通道成功!!
这个结果很让人纠结,因为它可以打印出
4
通道成功!!
就说明它执行到了调用Test()方法后面,上面如果调用那个传参的invokeWg方法,这个后面的语句都是不会执行的。但是这里既然执行了,为什么打印不出Test里面要打印的语句呢?
现在就是调用的问题了,在同事的电脑上调用我的webservice,报错如下:
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.ConnectException: Connection refused: connect
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.net.ConnectException: Connection refused: connect