Puisqu'il n'y a pas de preneurs, je décrirai ce que j'ai fait jusqu'à présent si quelqu'un d'autre a un problème similaire.
Sur mon client (à l'aide d'Office 2003 Web Services Toolkit), je souhaite recevoir une collection d'objets possédant une propriété qui est elle-même une collection d'objets. Par exemple, une collection d'objets de clients à partir d'un C# service Web où la classe client ressemble à quelque chose comme:
public class Customer
{
public string Name { get; set; }
public Collection<Address> Addresses { get; }
}
Le problème que j'ai est que la propriété des adresses peut parfois être une collection vide et le SOAP30 GenericTypeMapper n'est pas capable de gérer cela.
Dans mon cas spécifique, le client n'a pas vraiment besoin de la collecte d'adresses, je veux juste pouvoir obtenir les autres propriétés de la classe Customer. Donc, je ne me soucie pas vraiment de la propriété de variante "Addresses" créée par Web Services Toolkit.
Ce que je l'ai fait est de créer une DLL VB6 ActiveX avec une classe avec une implémentation minimaliste de ISoapMapper qui renvoie toujours une référence d'objet non initialisée:
Implements ISoapTypeMapper
Private Function ISoapTypeMapper_Iid() As String
End Function
Private Sub ISoapTypeMapper_Init(ByVal par_Factory As MSOSOAPLib30.ISoapTypeMapperFactory, ByVal par_Schema As MSXML2.IXMLDOMNode, ByVal par_WSMLNode As MSXML2.IXMLDOMNode, ByVal par_xsdType As MSOSOAPLib30.enXSDType)
End Sub
Private Function ISoapTypeMapper_Read(ByVal par_soapreader As MSOSOAPLib30.ISoapReader, ByVal par_Node As MSXML2.IXMLDOMNode, ByVal par_encoding As String, ByVal par_encodingMode As MSOSOAPLib30.enEncodingStyle, ByVal par_flags As Long) As Variant
Set ISoapTypeMapper_Read = Nothing
End Function
Private Function ISoapTypeMapper_SchemaNode() As MSXML2.IXMLDOMNode
Set ISoapTypeMapper_SchemaNode = Nothing
End Function
Private Function ISoapTypeMapper_VarType() As Long
ISoapTypeMapper_VarType = vbObject
End Function
Private Sub ISoapTypeMapper_Write(ByVal par_ISoapSerializer As MSOSOAPLib30.ISoapSerializer, ByVal par_encoding As String, ByVal par_encodingMode As MSOSOAPLib30.enEncodingStyle, ByVal par_flags As Long, par_var As Variant)
End Sub
Private Function ISoapTypeMapper_XsdType() As MSOSOAPLib30.enXSDType
ISoapTypeMapper_XsdType = enXSDUndefined
End Function
Je modifié le WSML généré par les services Web Toolkit pour utiliser cette implémentation pour la propriété appropriée:
Dim str_WSML As String
str_WSML = "<servicemapping>"
str_WSML = str_WSML & "<service name='MyService'>"
str_WSML = str_WSML & "<using PROGID='MSOSOAP.GenericCustomTypeMapper30' cachable='0' ID='GCTM'/>"
str_WSML = str_WSML & "<using PROGID='SoapHelper.EmptyArrayMapper' cachable='0' ID='EATM'/>" ' <== Added this line
str_WSML = str_WSML & "<types>"
...
str_WSML = str_WSML & "<type name='ArrayOfAddress' targetNamespace='http://...' uses='EATM' targetClassName='struct_Address'/>" '<== Added this line
str_WSML = str_WSML & "<type name='Address' targetNamespace='http://mynamespace.com/myapp/services/data' uses='GCTM' targetClassName='struct_Address'/>"
...
Ceci a réalisé ce dont j'avais besoin pour cette application.
Il me semble qu'il peut être possible d'obtenir un soutien pour les tableaux vides de façon plus générale en mettant en œuvre ISoapMapper de telle sorte que:
Je serais toujours intéressé d'entendre si quelqu'un a résolu le problème général. Peut-être pas parce que le client SOAP est obsolète et n'est plus supporté par Microsoft.