Я пишу приложение 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: