使用KSOAP2从Android发送数据到WCF

本文关键字:数据 WCF KSOAP2 Android 使用 | 更新日期: 2023-09-27 18:18:31

我的代码是,

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("ItemList", mainObject.toString());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.dotNet = true;
envelope.implicitTypes = true;
HttpTransportSE transport = new HttpTransportSE(URL);
try {
    transport.call(SOAP_ACTION, envelope);
} catch (final Exception e) {
    activity.runOnUiThread(new Runnable() {
        public void run() {
            new CustomToast(activity, SOAP_ACTION + " - "
                    + e.getMessage() + " error").show();
            e.printStackTrace();
        }
    });
}
try {
    fault = (SoapFault) envelope.bodyIn;
    activity.runOnUiThread(new Runnable() {
        public void run() {
            if (fault != null) {
                new CustomToast(activity, fault.getMessage())
                        .show();
            }
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
try {
    result = (SoapObject) envelope.bodyIn;
} catch (Exception e) {
    e.printStackTrace();
}

而mainObject是JSONObject,它包含以下数据,

{"ItemList":[{"ID":"","Name":"Abc","Mark":"81"},{"ID":"","Name":"XYZ","Mark":"82"}]}

我以以下方式在我的WCF中收到此消息。

[OperationContract]
void InsertUpdateEntry(Items ItemList);

Items

[CollectionDataContract(Namespace = "")]
public class Items : List<clsitems>
{
}

clsitems

[DataContract]
public class clsitems
{
    [DataMember]
    public string ID { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Mark { get; set; }
}

最后我面临以下例外。

java.io.IOException: HTTP request failed, HTTP status: 500

我只想将数据发送到Items类,因此任何其他解决方案也是可以接受的。

使用KSOAP2从Android发送数据到WCF

尝试在CollectionDataContract属性上设置ItemName。例如:

[CollectionDataContract(Name = "Custom{0}List", ItemName = "CustomItem")]
public class Items : List<clsitems>
{
}

CollectionDataContractAttribute的目的是在处理来自非提供者的数据时简化互操作性,并控制序列化实例的确切形状。为此,ItemName属性使您能够控制集合中重复项的名称。当提供程序不使用XML元素类型名称作为数组项名称时,这尤其有用,例如,如果提供程序使用"String"作为元素类型名称而不是XSD类型名称"String"。

从这里取

找到你问题的解决办法了。HTTP 500是一个内部服务器错误,因此您应该检查服务器是否与SOAPUI或其他工具一起工作。然后确保您可以从设备到达URL(在这种情况下的IP号码),然后开始调试ksaop调用。确保你的web服务工作正常与否

您可以像这样在服务器端启用跟踪,并检查结果文件,包括记录的SOAP消息。然后你就可以找出问题所在了。将其添加到app.config或web.config中。(你可能需要更改一些设置)

<system.diagnostics>
<sources>
  <source propagateActivity="true" name="System.ServiceModel" switchValue="All">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="xml">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="xml" />
    </listeners>
  </source>
  <source name="CardSpace">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="xml">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.IO.Log">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="xml">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.Runtime.Serialization">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="xml">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.IdentityModel">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="xml">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>
<sharedListeners>
  <add initializeData="Traces.svclog" type="System.Diagnostics.XmlWriterTraceListener"
    name="xml" traceOutputOptions="ProcessId, ThreadId">
    <filter type="" />
  </add>
</sharedListeners>
</system.diagnostics>