2008-10-06 13 views
0

Je vais avoir le problème décrit ici:peut-type générique Mapper (toolkit MSSOAP) convaincre de manipuler des tableaux vides

http://groups.google.com/group/microsoft.public.xml.soap/browse_thread/thread/029ee5b5d4fa2440/0895d73c5c3720a1

Je consommais un Web Service en utilisant Office 2003 Web Services Toolkit. Cela génère des classes pour toutes les données renvoyées par mon service web: une des classes a une propriété qui est un tableau qui peut être vide.

Quand j'appelle le service Web, le type générique Mapper soulève une erreur:

array dimensions do not match definition 

Est-ce que quelqu'un sait d'une solution à ce problème qui me permet de continuer à utiliser les classes générées (je sais que je pouvais consommer le XML brut)?

Répondre

0

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:

  • Il détecte et traite le cas d'un tableau vide. Ou si le tableau est non-vide, il délègue au générateur standard GenericTypeMapper (0).

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.