我写了一个.net的Web service供java程式调用,有.net自定义对象传递。
自定义Class:
[Serializable]
public class E00900
{
      private string _autosend;
      public string autoSend
      {
           get
           {
               return _autosend;
           }
           set
           {
               _autosend = value;
           }
       }
       ......
}web service 方法:
        [WebMethod]
        [SoapRpcMethod(Action= "http://tempuri.org/Test1", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
        public E00900 Test1(string str)
        {
            E00900 e900 = new E00900();
            e900.autoSend = str;
            return e900;}[SoapRpcMethod(Action= "http://tempuri.org/Test2", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
 public string Test2(E00900 e900)
 {
            return e900.autoSend;
 }
  
Test1方法是传递一个字符串返回E00900对象,Test2方法传递E00900对象返回字符串用Java程式调用Test1方法是OK的,可以正常返回E00900对象,但是调用Test2方法就出问题了
Java程式Call Test2方法:            String namespace = "http://tempuri.org/";// xmlns            String methodName = "Test2";//方法名            String soapActionURI = "http://tempuri.org/Test2"; //節點            Service service = new Service();            Call call = (Call) service.createCall();            call.setTargetEndpointAddress(new java.net.URL(endpoint));            QName qn = new QName("E00900");                        call.registerTypeMapping(E00900.class, qn,                       new org.apache.axis.encoding.ser.BeanSerializerFactory(E00900.class, qn),                       new org.apache.axis.encoding.ser.BeanDeserializerFactory(E00900.class, qn));                        call.setOperationName(new QName(namespace, methodName));            call.setUseSOAPAction(true);            call.setSOAPActionURI(soapActionURI);//设置SOAPAction
                    E00900 e901 = new E00900();            e901.setAutoSend("123");            
            call.addParameter("e900", qn , ParameterMode.IN);            call.setReturnType(XMLType.XSD_STRING);            String ret = (String) call.invoke( new Object[] { e901 } );            System.out.println( "result is " + ret + ".");
提示错误讯息"伺服器無法處理要求。 --> 物件型別不可以轉換成目標型別。"
请问这个是.Net Server端的问题还是Java Client端的问题?应该如何解决? 

解决方案 »

  1.   

    java程序没有看懂,估计这里有问题: 
    String ret = (String) call.invoke( new Object[] { e901 } );
      

  2.   

    补充说明一下:
    JAVA这边会新建一个与E00900结构一样的类
    public class E00900 implements Serializable ...{          public E00900() ...{         }
        private static final long serialVersionUID = -6414428095965735488L;     ......      }
      

  3.   

    你写个net的客户端,调用同样的函数,抓取soapmessage。
    再让java客户端的的程序员把他发出的soapmessage给你,比较下应该就知道问题在哪里了。
      

  4.   

    可以这么调用吗?
    不是有wcf可以跨语言调用,写wcf吧?一样的
      

  5.   

    回5楼,我觉得应该可以用Axis调用的,Test1调用是OK的,就是Test2调用出现类型不能转换问题,我怀疑可能是.net Server 没有配置好或者是Java程式调用有问题,但是一直找不出问题出在哪!头疼!
      

  6.   

    既然你有怀疑了就去测试呀。照着思路去重新做一遍,确认一下是Server配置好了没有,如果配置好了在在JAVA里面测试能不能正确调用。或者设个断点单步调试下,看看到底是什么原因。祝你好运LZ!
      

  7.   

    跨语言间,不可以这样调用.
    你用JAVA写的E00900类 != .NET写的E00900类老老实实的使用基础数据类型吧.既然是WebService,跨语言间的调用与传递就应该严格的使用XML,而不要去使用自定义类,即使要用,也应该序列化成XML进行传递,而不能直接去new XXX自定义类.这样就失去WebService的意义了.
      

  8.   

    回7楼:
         谢谢!我有做过测试,eclips debug在
    String ret = (String) call.invoke( new Object[] { e901 } );这行出错,提示物件型別不可以轉換成目標型別,我是主要做.net的Java不太熟,不知道如何处理!
    回8楼:
    call.registerTypeMapping(E00900.class, qn, new org.apache.axis.encoding.ser.BeanSerializerFactory(E00900.class, qn), new org.apache.axis.encoding.ser.BeanDeserializerFactory(E00900.class, qn));
    这段程式应该是将类E00900序列化和反序列化,因为call Test1方法可以正常返回E00900对象,这应该可以说明用E00900序列化和反序列化是成功的,在call Test2方法出错,我觉得问题应该是.NET server端无法识别java序列化的E00900,不知道如何解决这个问题,头疼!
      

  9.   

    我以前做个JAVA为服务端,.net为客户端传递JAVA的bean对象是OK的,弄不明白返过来传递.net对象却出问题,哪位大侠帮忙说明一下原因,小弟感激不尽!