我的代码是,
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
类,因此任何其他解决方案也是可以接受的。
尝试在CollectionDataContract属性上设置ItemName。例如:
[CollectionDataContract(Name = "Custom{0}List", ItemName = "CustomItem")]
public class Items : List<clsitems>
{
}
CollectionDataContractAttribute旨在简化处理来自非提供程序的数据的互操作性,并控制序列化实例的确切形状。为此,ItemName属性使您可以控制集合中重复项的名称。当提供程序不使用XML元素类型名称作为数组项名称时,这尤其有用,例如,如果提供程序使用“String”作为元素类型名称而不是XSD类型名称“string”。
取自here
找到你的问题的解决方案.. 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>