Я изо всех сил пытаюсь расширить проект legacy. NET 2.0 (Delphi) для использования веб-службы, для которой издатель не предоставляет полноценный WSDL. Он только предоставил WSDl со всеми параметрами и типами ответов, объявленными как any:
<s:complexType>
<s:sequence>
<s:any minOccurs="0" maxOccurs="1" />
</s:sequence>
</s:complexType>
с дополнительными файлами xsd, описывающими параметры и типы ответов. Хотя с параметром c не было проблем, мне не удалось создать класс для десериализации ответа XML. Это то, что я получаю
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<CrearOfertasResponse xmlns="http://somenamespace.com">
<Ofertas xmlns="">
<Oferta codigo="TBGE202006151805211">
<Errores>
<Error>Some error text</Error>
</Errores>
</Oferta>
</Ofertas>
</CrearOfertasResponse>
</soapenv:Body>
</soapenv:Envelope>
, и это объявления методов / классов, которые я использую:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
'http://somebinding',
RequestNamespace='http://somenamespace.com',
ResponseNamespace='http://somenamespace.com',
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[result: System.Xml.Serialization.XmlElementAttribute('CrearOfertasResponse')]
function CrearOfertas(Ofertas:requestParameterType):OfertasResponse;
OfertaResponse = class {fragment}
strict private
itemsField: TArrayOfSystem_Object;
itemsElementNameField: TArrayOfResponseItemsChoiceType;
codigoField: string;
public
function get_Items: TArrayOfSystem_Object;
function get_ItemsElementName: TArrayOfResponseItemsChoiceType;
function get_codigo: string;
procedure set_Items(Value: TArrayOfSystem_Object);
procedure set_ItemsElementName(Value: TArrayOfResponseItemsChoiceType);
procedure set_codigo(Value: string);
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute('Detalle', TypeOf(string))]
[System.Xml.Serialization.XmlElementAttribute('Errores', TypeOf(Errores))]
[System.Xml.Serialization.XmlElementAttribute('Estado', TypeOf(string))]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute('ItemsElementName')]
property Items: TArrayOfSystem_Object read get_Items write set_Items;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute('ItemsElementName')]
[System.Xml.Serialization.XmlIgnoreAttribute]
property ItemsElementName: TArrayOfResponseItemsChoiceType read get_ItemsElementName write set_ItemsElementName;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute]
property codigo: string read get_codigo write set_codigo;
end;
TArrayOfOfertaResponse = array of OfertaResponse;
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=True)]
[System.Xml.Serialization.XmlTypeAttribute('Ofertas')]
OfertasResponse = class {fragment}
strict private
ofertaField: TArrayOfOfertaResponse;
public
function get_Oferta: TArrayOfOfertaResponse;
procedure set_Oferta(Value: TArrayOfOfertaResponse);
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute('Oferta')]
property Oferta: TArrayOfOfertaResponse read get_Oferta write set_Oferta;
end;
Error = class {fragment}
strict private
codigoField: string;
valueField: string;
public
function get_codigo: string;
function get_Value: string;
procedure set_codigo(Value: string);
procedure set_Value(Value: string);
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute]
property codigo: string read get_codigo write set_codigo;
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute]
property Value: string read get_Value write set_Value;
end;
TArrayOfError = array of Error;
Errores = class {fragment}
strict private
errorField: TArrayOfError;
public
function get_Error: TArrayOfError;
procedure set_Error(Value: TArrayOfError);
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute('Error')]
property Error: TArrayOfError read get_Error write set_Error;
end;
Вызов таких CrearOfertas
function OfertasWS.CrearOfertas(Ofertas:RequestParameterType):OfertasResponse;
var
results: TArrayOfSystem_Object;
begin
results := Self.Invoke('CrearOfertas', [Ofertas]);
result := OfertasResponse(results[0]);
end;
Возвращает ли результат = [null]
Есть какие-нибудь подсказки относительно того, что не так с моими объявлениями метода / класса?