テイカーがいないので、他の誰かが同様の問題を抱えている場合に備えて、これまでに行ったことを説明します。
クライアントで(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を実装することにより、より一般的に空の配列のサポートを実現できる可能性があるように思われます。
誰かが一般的な問題を解決したかどうか、私はまだ聞きたいです。おそらく、SOAPクライアントが廃止され、Microsoftによってサポートされなくなったためではありません。