使用KSOAP2从Android向WCF发送数据

时间:2014-08-19 06:50:43

标签: c# android json wcf ksoap2

我的代码是,

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类,因此任何其他解决方案也是可以接受的。

3 个答案:

答案 0 :(得分:0)

找到了您的问题的解决方案.HTTP 500是内部服务器错误,因此您应该检查服务器是否正在使用SOAPUI或其他一些启动器工具。然后确保您可以从设备访问URL(在这种情况下为IP编号),然后开始调试ksaop调用..确保您的Web服务正常工作

答案 1 :(得分:0)

您可以在服务器端启用这样的跟踪,并检查生成的文件,包括记录的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>

答案 2 :(得分:0)

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

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

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

取自here