我写了一个.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端的问题?应该如何解决?
自定义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端的问题?应该如何解决?
String ret = (String) call.invoke( new Object[] { e901 } );
JAVA这边会新建一个与E00900结构一样的类
public class E00900 implements Serializable ...{ public E00900() ...{ }
private static final long serialVersionUID = -6414428095965735488L; ...... }
再让java客户端的的程序员把他发出的soapmessage给你,比较下应该就知道问题在哪里了。
不是有wcf可以跨语言调用,写wcf吧?一样的
你用JAVA写的E00900类 != .NET写的E00900类老老实实的使用基础数据类型吧.既然是WebService,跨语言间的调用与传递就应该严格的使用XML,而不要去使用自定义类,即使要用,也应该序列化成XML进行传递,而不能直接去new XXX自定义类.这样就失去WebService的意义了.
谢谢!我有做过测试,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,不知道如何解决这个问题,头疼!