iphone app将对象数组传递给.net SOAP Web服务作为参数无法识别

时间:2012-03-22 21:35:32

标签: iphone .net ios web-services soap

我正在编写一个使用SOAP Web服务与asp.net服务器通信的ios应用程序。我的一个Web服务需要获取对象数组。双方的对象定义完全相同。

这是我尝试过的:当我只传递一个对象作为参数时,Web服务工作正常。但是一旦我传递了一个对象数组,我什么都没有回来。我知道Web服务中的代码永远不会被调用,这意味着服务器无法读取参数。有线的事情是Web服务没有返回任何内容,所以我无法分辨出什么是错的(我曾经从服务器收到错误消息,显示我过去做错了什么时的堆栈跟踪)。

我对SOAP Web服务并不熟悉,所以即使我在MSDN上花了很多时间,我仍然不明白什么是错的。发布Web服务后,我通过浏览器访问它。我将整个内容复制到我的iOS应用程序中,因此它应该在理论上工作,但它从来没有。

无论如何,这是服务器端代码:

[System.Web.Services.Protocols.SoapRPCMethod]
[WebMethod(EnableSession = true)]
[XMLInclude(typeof(Team))]
[XMLInclude(typeof(Team[]))]
[SoapInclude(typeof(Team))]
[SoapInclude(typeof(Team[]))]
public string testTeamWebService(Team[] teams) 
{
    // do something here
}

// class definition of Team
[Serializable]
public class Team
{
    public int TeamID;
    public string TeamName;
} 

根据网页服务页面(.asmx文件),我应该怎么做才能调用它:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://abc.com/" xmlns:types="https://abc.com/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

    <tns:testTeamWebService>
        <teams href="#id1" />
    </tns:testTeamWebService>

    <soapenc:Array id="id1" soapenc:arrayType="types:Team[2]">
         <Item href="#id2" />
         <Item href="#id3" />
    </soapenc:Array>

   <types:Team id="id2" xsi:type="types:Team">
       <TeamID xsi:type="xsd:int">int</TeamID>
       <TeamName xsi:type="xsd:string">string</TeamName>
   </types:Team>

   <types:Team id="id3" xsi:type="types:Team">
       <TeamID xsi:type="xsd:int">int</TeamID>
       <TeamName xsi:type="xsd:string">string</TeamName>
   </types:Team>
</soap:Body>
</soap:Envelope>

正如我所说,我构建了xml并在iOS中发送它。我使用了NSMutableURLRequest对象,构造的xml正是我上面提到的方式。

在我的其他Web服务中,我从服务器获取对象数组,所以我知道.net可以序列化数组。这是我的服务第一次需要将数组作为参数,所以我认为必须有一种方法。

感谢您的阅读,如果可以,请给我一些建议。


我终于从服务器收到了错误消息:

faultcode: soap:Server
 faultstring: System.Web.Services.Protocols.SoapException: Server was unable to process request.---> System.ArgumentException: Object of type 'System.Xml.XmlNode[]' cannot be converted to type 'abc.WebServices.Team[]'.
 at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
 at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
 at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
 at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
 at System.Web.Services.Protocols.LogicalMethodInfo.Invoke(Object target, Object[] values)
 at System.Web.Services.Protocols.WebServiceHandler.Invoke()
 --- End of inner exception stack trace ---
detail: 

2 个答案:

答案 0 :(得分:1)

我真的不知道如何解决您的问题,但万一您不能并且需要了解它,请查看http://sudzc.com/,这将生成您需要的所有代码客观要求c。 我使用它并且在发送数组时也遇到了一些问题(使用sudzc自动生成的类),但我解决了它们this way

答案 1 :(得分:0)

这是我的问题的解决方案。即使我不知道为什么我的代码不起作用,我所知道的是当参数传递给.net服务器时,它试图猜测我传递的对象是什么。不知怎的,它已经混淆了自定义对象数组,即使已经在web方法的开头定义和声明了自定义类。

要解决真正的问题,我有几个选择: &LT 1为卤素;将xml作为字符串传递,并在服务器端手动反序列化。 &LT 2 - ;将数据数据集传递给服务器。 &LT 3的密度;将我的类定义为XMLNode并将其传递给服务器。

无论我选择哪种方式,我都需要做一些工作来正确地反序列化xml。

还有另一种方法可以做到。

由于服务器只是在我使用RPC格式的SOAP消息时感到困惑,那么另一种格式呢?我尝试了下面的代码和宾果游戏,服务器马上把它拿起来。

 [WebMethod]
 public string testTeamWebService(Team[] teams) 
{
    // do something here
}


// class definition of Team
[Serializable]
public class Team
{
    public int TeamID;
    public string TeamName;
} 

然后以这种方式格式化xml请求:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<testTeamWebService xmlns="http://tempuri.org/">
  <teams>
    <Team>
      <TeamID>int</TeamID>
      <TeamName>string</TeamName>
    </Team>
    <Team>
      <TeamID>int</TeamID>
      <TeamName>string</TeamName>
    </Team>
  </teams>
</testTeamWebService>

在这里,我特别感谢来自Microsoft的Peter pi - MSFT帮助我解决这个问题,这里是asp.net上的链接:

http://forums.asp.net/t/1784291.aspx/1?asp+net+SOAP+RPC+web+method+could+not+read+object+array+parameter

希望我的帖子可以帮助遇到同样问题的人。