3

我在我的 android 应用程序中使用 KSOAP2,当我尝试执行特定的 web 服务请求时,我得到了这个“双 ID”异常。我哪里错了?请帮我。

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(SOAP_ADDRESS);

        SoapPrimitive response = null;
        try {   
          androidHttpTransport.call(SOAP_ACTION, envelope); //<<--- Getting exception here
          response = (SoapPrimitive)envelope.getResponse();

        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), e+"", Toast.LENGTH_LONG).show();
        }

堆栈跟踪 :

java.lang.RuntimeException: double ID
at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:407)
at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:273)
 at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:389)
at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:273)
at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:389)
at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:273)
 at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:389)
at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:273)
 at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:389)
 at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:151)
 at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:140)
 at org.ksoap2.transport.Transport.parseResponse(Transport.java:116)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:235)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:114)
at com.menthatech.soap_login_test.SampleSoapTest_LoginActivity.onClick(SampleSoapTest_LoginActivity.java:94)
at android.view.View.performClick(View.java:2408)
at android.view.View$PerformClick.run(View.java:8816)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

1

我今天遇到了这个异常...不知道你的情况是不是一样...

在我的情况下,是因为 Web 服务(C#)返回一个数据集,但是,我改变了一些列然后返回,所以,我有 2 个具有相同 ID 的表。带有 diffgr:before 标签。

因此,当您处理数据集时,只需将代码放在 Web 服务返回对象之前:

ds.AcceptChanges();

:-)

于 2014-10-28T16:48:27.203 回答
0

这是一个很好的例子,可以帮助你:点击这里

这是我对这个问题的快速修复:

SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);

SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
soapEnvelope.setOutputSoapObject(Request);
soapEnvelope.dotNet = true;


List<Integer> companies =  new ArrayList<Integer>();
companies.add(65);
companies.add(66);
companies.add(67);

Request.addProperty("name", "test1");
SoapObject soapCompanies = new SoapObject(NAMESPACE, "companies");
for (Integer i : companies){
    soapCompanies.addProperty("int", i);
}
Request.addSoapObject(soapCompanies);

输出 XML:

<n0:companies xmlns:n0 = "http://tempuri.org/">
            <int i:type = "d:int">65</int>
            <int i:type = "d:int">66</int>
            <int i:type = "d:int">67</int>
</n0:companies>
<name i:type = "d:string">test1</name>
于 2012-08-08T11:01:32.770 回答
-1

我想为遇到这个问题的人记录下不同的解决方案......

因为调用DataSet 数据回XML 使用“diffgram”。“双 ID”错误是 <diffgr:id> 重复,具有相同的 ID

例如:
A 表有“Table”、“Table1”(如果您的数据集选择更多表)
如果“A”有 11 条记录并显示到 XML 是
<Table diffgr:id="Table1">、<Table diffgr: id="Table2">.........<Table diffgr:id="Table11">

如果 B 有 10 条记录并显示给 XML 是
<Table1 diffgr:id="Table11">、<Table diffgr:id="Table12">.........<Table diffgr:id="Table110">

所以。您可以看到 diffgr:id="Table11" 重复。这就是为什么有“双重身份”错误

解决方案

更改数据集表名称

SqlDataAdapter.Fill(DataSet);
DataSet.Tables[0].TableName = "Table_";
DataSet.Tables[1].TableName = "Table1_";
数据集.AcceptChanges();

于 2020-09-10T03:19:25.890 回答