0

私はここで説明されている問題を抱えています:

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

私はWeb Service使用して消費していOffice 2003 Web Services Toolkitます。これにより、Web サービスによって返されるすべてのデータのクラスが生成されます。クラスの 1 つに、空の可能性がある配列であるプロパティがあります。

Web サービスを呼び出すと、Generic Type Mapper で次のエラーが発生します。

array dimensions do not match definition

生成されたクラスを引き続き使用できるようにするこの問題の解決策を知っている人はいますか (生の XML をそのまま使用できることはわかっています)。

4

1 に答える 1

0

テイカーがいないので、他の誰かが同様の問題を抱えている場合に備えて、これまでに行ったことを説明します。

クライアントで(Office 2003 Webサービスツールキットを使用して)、それ自体がオブジェクトのコレクションであるプロパティを持つオブジェクトのコレクションを受け取りたい。たとえば、Customerクラスが次のようになっているC#WebサービスからのCustomerオブジェクトのコレクション。

public class Customer
{
    public string Name { get; set; }

    public Collection<Address> Addresses { get; }
}

私が抱えている問題は、Addressesプロパティが空のコレクションになることがあり、SOAP30GenericTypeMapperがこれを処理できないことです。

私の特定のケースでは、クライアントは実際にはアドレスのコレクションを必要としませんでした。Customerクラスの他のプロパティを取得できるようにしたいだけです。したがって、Webサービスツールキットによって作成された「Addresses」バリアントプロパティに何が含まれているかはあまり気にしません。

私が行ったことは、初期化されていないオブジェクト参照を常に返すISoapMapperの最小限の実装を持つクラスでVB6ActiveXDLLを作成することです。

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

次に、Web Services Toolkitによって生成されたWSMLを変更して、適切なプロパティにこの実装を使用しました。

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'/>"
...

これにより、このアプリケーションに必要なものが達成されました。

次のような方法でISoapMapperを実装することにより、より一般的に空の配列のサポートを実現できる可能性があるように思われます。

  • 空の配列の場合を検出して処理します。

  • または、配列が空でない場合は、標準のGenericTypeMapperに委任します。

誰かが一般的な問題を解決したかどうか、私はまだ聞きたいです。おそらく、SOAPクライアントが廃止され、Microsoftによってサポートされなくなったためではありません。

于 2008-10-09T15:32:24.450 に答える