Axis接收远程调用c# webservice返回的数组

时间:2022-09-02 18:18:07
   最近在写WebService,但自己对WebService不是太了解,只是一个初学者。突然想在java与C#之间互相调用WebService,C#调用Axis的WebService通过VS2010的Web服务自动生成调用成功,用Java调用C#的WebService返回字符串时无异常。但在用http://www.webxml.com.cn/WebServices/WeatherWebService.asmx获取天气时返回数组出现异常,后通过rohsuton的webservice学习笔记【一】——接收远程调用webservice返回的数组(http://blog.csdn.net/rohsuton/article/details/4355011)这篇文章解决了问题。目前加了soap认证的服务还没有互调成功。
代码:
package web.service.client;

import java.net.URL;
import java.util.Vector;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

public class TestWeather
{
public static void main(String[] args) throws Exception
{
String url = "http://www.webxml.com.cn/WebServices/WeatherWebservice.asmx";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(url));
//设置要调用的方法,一定要带命名空间
call.setOperationName(new QName("http://WebXml.com.cn/", "getWeatherbyCityName"));
//设置要传入的参数
call.addParameter(new QName("http://WebXml.com.cn/", "theCityName"), XMLType.XSD_STRING, ParameterMode.IN);
//设置要接收的参数类型
call.setReturnType(XMLType.SOAP_VECTOR); //
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://WebXml.com.cn/getWeatherbyCityName");


Vector result = (Vector) call.invoke(new String[]{"上海"});
for (int i=0;i< result.size();i++)
System.out.println(result.get(i));
}
}




附:rohsuton的webservice学习笔记【一】——接收远程调用webservice返回的数组(http://blog.csdn.net/rohsuton/article/details/4355011)以供查看
最近突然想学习webservice,作为一个初学者没想着一开始开发webservice,想先练练手,使用axis2 1.4 调用webservice,虽然只是调用webservice客户端,但是遇到的麻烦还真不少。
其中折磨我最久的问题就是如何处理远程调用返回的数组了,我照着网上的讲解调用一些网上公开的webservice,返回类型为String或者为schema.xml时都没有问题,但是返回的结果为数组时就出现以下异常:


- Exception:
org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType
 at org.apache.axis.encoding.DeserializerImpl.onStartElement(DeserializerImpl.java:453)
 at org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:393)
 at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048)
 at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)


 


我的测试代码如下:


package webservice;


import java.net.URL;
import java.util.Vector;


import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;


import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;


public class Test {


 public static void main(String[] args) {
  Service service = new Service();
  Call call;
  try {
  call = (Call) service.createCall();
  call.setTargetEndpointAddress(new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"));
  call.setOperationName(new QName("http://WebXml.com.cn/","getWeatherbyCityName"));
  call.addParameter(new QName("http://WebXml.com.cn/", "theCityName"),XMLType.XSD_STRING,ParameterMode.IN);
  call.setReturnType(XMLType.SOAP_ARRAY);
  call.setUseSOAPAction(true);
  call.setSOAPActionURI("http://WebXml.com.cn/getWeatherbyCityName");
  String[] result = (String[])call.invoke(new Object[]{"昆明"});
  } catch (Exception e) {
  e.printStackTrace();
  }
 }
}
根据前面学习的经验我知道是设置返回值类型错误,但是我在网上找了一整天的资料,很难找到关于接收字符串数组的例子,而且搜索出来的是千篇一律的例子,基本都是只返回字符串的(可能是我的搜索水平有问题吧,O(∩_∩)O~)。找到一两个关于返回字符串数组的问题都是设置返回值类型为XMLType.SOAP_ARRAY,但是这样会跑出同样的异常,我不知道是我的axis的版本问题还是什么,整的我都快崩溃了,后面没办法只能试试可能的其他类型,最后发现有一个XMLType.SOAP_VECTOR类型,运行后发现没有出现异常。于是使用Vector接收返回值:Vector result = (Vector)call.invoke(new Object[]{"昆明"});然后把的内容输出后发现可以了,问题终于解决了,虽然这个问题看起来挺简单的,但是折腾了我很久,总算是解决了,O(∩_∩)O哈哈~。我把这个问题写下来,希望能给和我一样困惑的人提供点帮助,O(∩_∩)O~。


既然已经写了一些,我想把我遇到的其他问题也写下来吧,说不定以后用得着。在刚开始的时候遇到过以下异常:


AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server
 faultSubcode: 
 faultString: 服务器无法处理请求。 ---&gt; 未将对象引用设置到对象的实例。
 faultActor: 
 faultNode: 
 faultDetail:


在网上找了一些资料,最后发现自己出现的问题,我原来在设置参数的时候是如下设置的:


call.addParameter("theCityName",XMLType.XSD_STRING,ParameterMode.IN);


把该条语句改为:


call.addParameter(new QName("http://WebXml.com.cn/", "theCityName"),XMLType.XSD_STRING,ParameterMode.IN);后问题就解决了,但是其中的原因我就不清楚了,希望哪位知道的朋友解释一下,谢谢!!!