Androidからwcf soapサービスのメソッドにアクセスするためにksoap2を使用しようとしています。単純な型パラメーターをメソッドに正常に渡すことができました。正常に機能しました。しかし、オブジェクトを渡そうとすると、wcf メソッドはすべてのオブジェクト値に対して 0 を受け取ります。
WP7 アプリで同じ SOAP サービスを使用しましたが、問題なく動作します。
私のサービスには、ksoapadd と addParam の 2 つのメソッドがあります。addParam は 2 つの整数を取り、それらの合計を返します (これは機能します)。ksoapadd は、2 つの整数要素を持つクラス testadd のオブジェクトを受け取り、ksoapadd はそれらの合計を返します (これは 0 を取得して送信します)。
名前空間と関係があると思いますが、解決方法がわかりません。ソープリクエストを正しく取得するために試行錯誤を行ってきましたが、まだ運がありません.
何をすべきかを理解するのを手伝ってくれる人はいますか?私は多くのオプションを試しましたが、同様の問題を抱えている他の人々を何らかの形で助けましたが、役に立ちませんでした.
ここに私のwsdlがあります:
<?xml version="1.0" encoding="UTF-8"?>
-<wsdl:definitions xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:tns="http://tempuri.org/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://tempuri.org/" name="Service1">
-<wsdl:types>
-<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import namespace="http://tempuri.org/" schemaLocation="http://localhost:51086/Service1.svc?xsd=xsd0"/>
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" schemaLocation="http://localhost:51086/Service1.svc?xsd=xsd1"/>
<xsd:import namespace="http://schemas.datacontract.org/2004/07/InsertIntoUserWCF" schemaLocation="http://localhost:51086/Service1.svc?xsd=xsd2"/>
</xsd:schema>
</wsdl:types>
-<wsdl:message name="IService1_ksoapAdd_InputMessage">
<wsdl:part name="parameters" element="tns:ksoapAdd"/>
</wsdl:message>
-<wsdl:message name="IService1_ksoapAdd_OutputMessage">
<wsdl:part name="parameters" element="tns:ksoapAddResponse"/>
</wsdl:message>
-<wsdl:message name="IService1_addParam_InputMessage">
<wsdl:part name="parameters" element="tns:addParam"/>
</wsdl:message>
-<wsdl:message name="IService1_addParam_OutputMessage">
<wsdl:part name="parameters" element="tns:addParamResponse"/>
</wsdl:message>
-<wsdl:portType name="IService1">
-<wsdl:operation name="ksoapAdd">
<wsdl:input message="tns:IService1_ksoapAdd_InputMessage" wsaw:Action="http://tempuri.org/IService1/ksoapAdd"/>
<wsdl:output message="tns:IService1_ksoapAdd_OutputMessage" wsaw:Action="http://tempuri.org/IService1/ksoapAddResponse"/>
</wsdl:operation>
-<wsdl:operation name="addParam">
<wsdl:input message="tns:IService1_addParam_InputMessage" wsaw:Action="http://tempuri.org/IService1/addParam"/>
<wsdl:output message="tns:IService1_addParam_OutputMessage" wsaw:Action="http://tempuri.org/IService1/addParamResponse"/>
</wsdl:operation>
</wsdl:portType>
-<wsdl:binding name="BasicHttpBinding_IService1" type="tns:IService1">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
-<wsdl:operation name="InsertUserDetails">
<soap:operation style="document"
-<wsdl:operation name="ksoapAdd">
<soap:operation style="document" soapAction="http://tempuri.org/IService1/ksoapAdd"/>
-<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
-<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
-<wsdl:operation name="addParam">
<soap:operation style="document" soapAction="http://tempuri.org/IService1/addParam"/>
-<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
-<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
-<wsdl:service name="Service1">
-<wsdl:port name="BasicHttpBinding_IService1" binding="tns:BasicHttpBinding_IService1">
<soap:address location="http://localhost:51086/Service1.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
これは私のxsd2です:
<?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/InsertIntoUserWCF"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.datacontract.org/2004/07/InsertIntoUserWCF"
elementFormDefault="qualified">
-<xs:complexType name="testadd">
-<xs:sequence>
<xs:element name="number_1" type="xs:int" minOccurs="0"/>
<xs:element name="number_2" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="testadd" type="tns:testadd" nillable="true"/>
</xs:schema>
ここに私の石鹸のリクエストがあります:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<ksoapAdd xmlns="http://tempuri.org/" id="o0" c:root="1">
<n0:num1 xmlns:n0="http://tempuri.org/">
<number_1>25</number_1>
<number_2>25</number_2>
</n0:num1>
</ksoapAdd>
</v:Body>
</v:Envelope>
石鹸応答:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ksoapAddResponse xmlns="http://tempuri.org/">
<ksoapAddResult>0</ksoapAddResult>
</ksoapAddResponse>
</s:Body>
</s:Envelope>
これは、ksoap2 を使用した私の Java コードです。
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:51086/Service1.svc?wsdl";
private static final String SOAP_ACTION4 = "http://tempuri.org/IService1/ksoapAdd";
private static final String METHOD_NAME4 = "ksoapAdd";
private static final String SOAP_ACTION5 = "http://tempuri.org/IService1/addParam";
private static final String METHOD_NAME5 = "addParam";
try {
testadd numX = new testadd(25,25);
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME4);
PropertyInfo prop = new PropertyInfo();
prop.setNamespace(NAMESPACE);
prop.setName("num1");
prop.setType(numX.getClass());
prop.setValue(numX);
Request.addProperty(prop);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);
envelope.implicitTypes = true;
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug=true;
androidHttpTransport.call(SOAP_ACTION4, envelope);
Log.d(logtag + " request dump", androidHttpTransport.requestDump);
Log.d(logtag + " response dump", androidHttpTransport.responseDump);
final SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
final int num = Integer.parseInt(response.toString());
} catch (Exception e)
{
e.printStackTrace();
}
これは私のJavaクラスtestaddです:
import java.util.Hashtable;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class testadd implements KvmSerializable{
int number1;
int number2;
testadd(){}
testadd(int a, int b){ number1 = a; number2 = b;}
@Override
public Object getProperty(int arg0) {
switch(arg0)
{
case 0:
return number1;
case 1:
return number2;
}
return null;
}
@Override
public int getPropertyCount() {
return 2;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch(arg0)
{
case 0:
arg2.type = PropertyInfo.INTEGER_CLASS;
arg2.name = "number_1";
break;
case 1:
arg2.type = PropertyInfo.INTEGER_CLASS;
arg2.name = "number_2";
break;
default:break;
}
}
@Override
public void setProperty(int arg0, Object value) {
switch(arg0)
{
case 0:
number1 = Integer.parseInt(value.toString());
break;
case 1:
number2 = Integer.parseInt(value.toString());
break;
default:
break;
}
}
}
サービスコード:
<ServiceContract()> _
Public Interface IService1
<OperationContract()> _
Function ksoapAdd(ByVal num1 As testadd) As Integer
<OperationContract()> _
Function addParam(ByVal num1 As Integer, ByVal num2 As Integer) As Integer
End Interface
<DataContract()> _
Public Class testadd
Private number1 As Integer
Private number2 As Integer
<DataMember()> _
Public Property number_1() As Integer
Get
Return number1
End Get
Set(ByVal value As Integer)
number1 = value
End Set
End Property
<DataMember()> _
Public Property number_2() As Integer
Get
Return number2
End Get
Set(ByVal value As Integer)
number2 = value
End Set
End Property
End Class
サービス方法:
Public Function ksoapAdd(ByVal num1 As testadd) As Integer Implements IService1.ksoapAdd
MsgBox(num1.number_1)
Return num1.number_1 + num1.number_2
End Function
Public Function addParam(ByVal num1 As Integer, ByVal num2 As Integer) As Integer Implements IService1.addParam
MsgBox(num1 + num2)
Return num1 + num2
End Function
これが大量のコードであることは承知していますが、全体像を理解する必要があると思います。
ありがとうございました!