приложение iphone передает массив объектов в .net SOAP webservice как параметр, который не распознается - PullRequest
0 голосов
/ 23 марта 2012

Я пишу приложение ios, которое взаимодействует с сервером asp.net с помощью веб-служб SOAP.один из моих веб-сервисов должен принимать массив объектов.Определения объектов одинаковы с обеих сторон.

Вот что я попробовал: когда я передавал только один объект в качестве параметра, веб-служба работала нормально.Но как только я передал массив объектов, я ничего не получил.Я знаю, что код внутри веб-службы никогда не вызывается, что означает, что серверу не удалось прочитать параметры.Дело в том, что веб-служба ничего не возвращала, поэтому я не могу сказать, что не так (раньше я получал сообщение об ошибке от сервера, показывающее мне трассировку стека, когда я делал что-то не так в прошлом).знаком с веб-службами SOAP, поэтому, хотя я провел много времени в MSDN, я все еще не понимал, в чем дело.После публикации веб-сервиса я получил к нему доступ через браузер.Я скопировал все это в свое приложение для 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 точно такой же, как я упоминал выше.

В других моих веб-службах я получаю объектные массивы с сервера, поэтому я знаю, что .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 ]

1 голос
/ 23 марта 2012

Я не знаю, как решить вашу проблему, но на случай, если вам не удастся и вам нужно ее получить, взгляните на http://sudzc.com/, который сгенерирует весь код, который вам понадобится сделать ваши запросы в цель c. Я использовал его, и у меня были некоторые проблемы при отправке массивов (с использованием автоматически сгенерированных классов sudzc), но я решил их таким образом

0 голосов
/ 28 марта 2012

Вот решение моей проблемы.Несмотря на то, что я точно не знаю, почему мой код не работал, я знаю, когда параметр передавался на сервер .net, он пытался угадать, какой объект я передал.И каким-то образом он запутался в массиве пользовательских объектов, хотя пользовательский класс был определен и объявлен в начале веб-метода.

Чтобы решить реальную проблему, у меня есть несколько вариантов: <1>Передайте xml в виде строки и вручную десериализуйте его на стороне сервера.<2> Передайте набор данных на сервер.<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>

Здесь я хочу особо поблагодарить Питера Пи - MSFT от Microsoft за помощь в решении этой проблемы, и вот ссылка на asp.net:

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

Надеюсь, что мой пост поможет некоторымлюди, которые сталкиваются с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...