.NET вызывает веб-сервисы и возвращает нули - PullRequest
1 голос
/ 29 ноября 2011

У меня есть веб-сервисы, и я добавил его в свой проект .NET в качестве веб-ссылки.Один из веб-методов возвращает вложенный массив (NameValuePairDTOArray [NameValuePairDTO []).Я могу получить только нулевые объекты в коде .NET, но он вернул данные, когда я тестировал SoapUI.

Я вставил сюда некоторую часть файла wsdl.

Это определение метода.

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://services.mymachine.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IneteractionService" targetNamespace="http://services.mymachine.com/">
    <operation name="getValue" parameterOrder="parameters">
        <input message="tns:MyServices_getValues"/>
        <output message="tns:MyServices_getValuesResponse"/>
        <fault message="tns:ServiceException" name="ServiceException"/>
    </operation>

    <xs:schema xmlns:ns1="http://ods.mymachine.com/v1_0_0" xmlns:tns="http://services.mymachine.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.mymachine.com/" version="1.0">
        <xs:import namespace="http://ods.mymachine.com/v1_0_0"/>
        <xs:element name="ServiceException" type="tns:ServiceException"/>
        <xs:element name="getValue" type="tns:getValue"/>
        <xs:element name="getValuesResponse" type="tns:getValuesResponse"/>
        <xs:complexType name="getValue">
            <xs:sequence>
            <xs:element minOccurs="0" name="firstName" type="xs:string"/>
            <xs:element minOccurs="0" name="lastName" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
        <xs:complexType name="getValuesResponse">
            <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="ns1:NameValuePairDTOArray"/>
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
</definitions>

Это определения данных ответов.

<xs:schema xmlns:ns1="http://common.mymanchine.com/v1_0_0" xmlns:tns="http://ods.mymachine.com/v1_0_0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://ods.mymachine.com/v1_0_0" version="1.0">
    <xs:import namespace="http://common.mymanchine.com/v1_0_0"/>
    <xs:complexType final="#all" name="NameValuePairDTOArray">
        <xs:sequence>
        <xs:element maxOccurs="unbounded" minOccurs="0" name="item" nillable="true" type="tns:NameValuePairDTO"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="NameValuePairDTO">
        <xs:complexContent>
            <xs:extension base="ns1:DataTransferObject">
                <xs:sequence/>
                <xs:attribute name="name" type="xs:string"/>
                <xs:attribute name="value" type="xs:string"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema

Классы прокси, сгенерированные .NET, выглядят так:

[WebServiceBinding(Name = "InteractionServicesBinding", Namespace = "http://services.mymachine.com/")]
[XmlInclude(typeof(DataTransferObject))]
[DebuggerStepThrough]
[GeneratedCode("System.Web.Services", "4.0.30319.1")]
[DesignerCategory("code")]
public class InteractionServicesServiceWse : WebServicesClientProtocol
{
    public InteractionServicesServiceWse();

    [SoapDocumentMethod("", RequestNamespace = "http://services.mymachine.com/", 
     ResponseNamespace = "http://services.services.mymachine.com/", Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
    public NameValuePairDTOArray[] getValue(string firstName, string lastName);
}

[Serializable]
[XmlType(Namespace = "http://ods.mymachine.com/v1_0_0")]
[GeneratedCode("System.Xml", "4.0.30319.233")]
[DebuggerStepThrough]
[DesignerCategory("code")]
public class NameValuePairDTOArray
{
    public NameValuePairDTOArray();

    [XmlElement("item", IsNullable = true)]
    public NameValuePairDTO[] item { get; set; }
}

[Serializable]
[DesignerCategory("code")]
[XmlType(Namespace = "http://ods.mymachine.com/v1_0_0")]
[GeneratedCode("System.Xml", "4.0.30319.233")]
[DebuggerStepThrough]
public class NameValuePairDTO : DataTransferObject
{
    public NameValuePairDTO();

    [XmlAttribute]
    public string name { get; set; }
    [XmlAttribute]
    public string value { get; set; }
}

Теперь, если я вызову getValue(«Джон», «Питер»), в .NET он вернется, как показано ниже.

enter image description here

Но soapUI возвращает что-то вроде:

<env:Body>
  <ns2:getValueResponse xmlns:ns2="http://services.mymachine.com/">
     <return>
        <item value="123" name="BONUS_ID"/>
        <item value="456" name="POPUP_OBJECT_ID"/>
     </return>
     <return>
        <item value="123" name="BONUS_ID"/>
        <item value="567" name="POPUP_OBJECT_ID"/>
     </return>
  </ns2:getValueResponse>
</env:Body>

Похоже, что .NET не может обнаружить, что NameValuePairDTO / item является массивом.

Что не так?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Что ж, проблема заключалась в том, что что-то не так на стороне сервера.

Схема определила, что NameValuePairDTOArray и NameValuePairDTO были перепрошены.

Но посмотрите на ответ xml,

<env:Body>
  <ns2:getValueResponse xmlns:ns2="http://services.mymachine.com/">
     <return>
        <item value="123" name="BONUS_ID"/>
        <item value="456" name="POPUP_OBJECT_ID"/>
     </return>
     <return>
        <item value="123" name="BONUS_ID"/>
        <item value="567" name="POPUP_OBJECT_ID"/>
     </return>
  </ns2:getValueResponse>

Возврат (NameValuePairDTOArray) и элемент (NameValuePairDTO) не определены.И сгенерированный прокси-класс предполагает, что они квалифицированы, потому что схема определена, но это привело к ошибке синтаксического анализа xml.

Быстрое исправление состоит в том, чтобы вручную добавить неквалифицированный атрибут в свойство NameValuePairDTO в классе NameValuePairDTOArray.Inбудущее, обслуживающая сторона должна решить эту проблему.

1 голос
/ 30 ноября 2011

Ваш NameValuePairDTOArray в сгенерированном коде отображается с пространством имен "http://ods.mymachine.com/v1_0_0", но это пространство имен отсутствует в выходном XML-файле (поэтому .net не знает, что тег" return "относится к NameValuePairDTOArray).

Возможно, вы удалили атрибут XmlTypeAttribute из кода сервера.

Так что вам следует либо обновить веб-ссылку на стороне клиента, либо добавить обратно атрибут XmlTypeAttribute на стороне сервера.

...