在android端调用webService 无参的和基本类型参数的方法都没问题, 现在要调用的是一个带复杂对象类型(List<Object>Object中还包含List<Object>)的方法,主要是提交一些数据到服务器。一开始按照基本类型的套路调用,提示类型序列化错误(此时应该还没连上服务器),实现KavSerializable依然无效,而如果干脆传一个String过去,报'Server did not recognize the value of HTTP Header SOAPAction: http://serverName/method().' faultactor: 'null' detail: org.kxml2.kdom.Node@43fedc60同样的WebService为什么带对象类型的对数会拒绝访问呢? 服务器是.net 写的,这个问题困了我一个多星期了,期望成功传过对象类型的前辈给以帮助 ,不甚感激! q258114255网上的各种方法我查遍了,谢绝copy

解决方案 »

  1.   

    发送类型和接收类型应该一致的吧,记得不能发送集合的,可以试试发送xml类型的string字符串,C#后台接收到以后解析.
      

  2.   

    谢谢关注以下是核心代码: public static final List<SoapObject> genHotelOrder(HotelOrder ho) {
    byte[] bt = objectToByte(ho);
    String data = org.kobjects.base64.Base64.encode(bt);//听网上说可以用byte[]方式传参,失败后也没完回来
    String methodName = "hotelOrder()";
    SoapObject request = new SoapObject(NAME_SPACE, methodName);
    PropertyInfo pi = new PropertyInfo();
    pi.setName("hotelOrder");
    pi.setValue(data);
    pi.setType(HotelOrder.class);
    request.addProperty(pi);
    return core(HOTEL_URL, request, methodName);
    } private final static List<SoapObject> core(String url, SoapObject request,
    String methodname) {
    try {
    HttpTransportSE ht = new HttpTransportSE(url, 22000);// 设置超时时间22秒
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.addMapping(NAME_SPACE, "tns:hotelOrder",
    new HotelOrder().getClass());
    envelope.addMapping(NAME_SPACE, "tns:ArrayOfOrderRoomPrice",
    new OrderRoomInfo().getClass());
    envelope.setOutputSoapObject(request);
    ht.call(NAME_SPACE + methodname, envelope);
    /*下面是得到返回值后的解析,不在此问题范围内*/
    request = (SoapObject) envelope.getResponse();
    int resultCount = request.getPropertyCount(); List<SoapObject> soapObjects = new ArrayList<SoapObject>();
    SoapObject subSO = null;
    for (int i = 0; i < resultCount; i++) {
    subSO = (SoapObject) request.getProperty(i);
    soapObjects.add(subSO);
    }
    return soapObjects;
    } catch (SocketTimeoutException e) {
    e.printStackTrace();
    return null;// 如果超时,让它返回null,以便告知user是网络问题而不是没有结果
    } catch (IOException ea) {
    ea.printStackTrace();
    } catch (XmlPullParserException e) {
    e.printStackTrace();
    return null; // 理由同上
    }
    return null;
    }
      

  3.   

    我意思是  同一个WebService, 为什么带对象类型参数的方法这么仿问起来这么麻烦,而且使用浏览器是拒绝访问的