Search code examples
f#confluencetype-providers

F# WSDL Type Provider and Confluence


When I use the WSDL Type provider to create a client for Confluence SOAP service then I get all methods with (unit -> unit) signature.

#r "System.ServiceModel.dll"
#r "FSharp.Data.TypeProviders.dll"
open System.ServiceModel
open Microsoft.FSharp.Data.TypeProviders

[<Literal>]
let ConfluenceServiceWsdl = "https://developer.atlassian.com/rpc/soap-axis/confluenceservice-v2?WSDL"
type ConfluenceService = Microsoft.FSharp.Data.TypeProviders.WsdlService<ConfluenceServiceWsdl>

let service = ConfluenceService.``Getconfluenceservice-v2``()

service.getPages;;
...
val it : (unit -> unit) = <fun:it@3-1>

but it should be something like Vector<PageSummary> getPages(String token, String spaceKey) - (from Remote Confluence Methods documentation)

What am I doing wrong? How to create full-functional service client? Is something wrong with WSDL?

P.S. Confluence SOAP WSDL was generated by Apache Axis.


Solution

  • Looks like this issue. As a workaround (a dirty one) you can do the following:

    1. Specify LocalSchemaFile=.wsdlschema and ForceUpdate=false
    2. Open .wsdlschema, fix messages that corresponds to faults and add corresponding elements

    As a sample:

    this

    <wsdl:message name="VersionMismatchException">
        <wsdl:part name="fault" type="tns1:VersionMismatchException"/>
    </wsdl:message>
    

    will become

    <wsdl:message name="VersionMismatchException">
        <wsdl:part name="fault" element="tns1:VersionMismatchException"/>
    </wsdl:message>
    

    and this

    <complexType name="AlreadyExistsException">
        <complexContent>
            <extension base="tns1:RemoteException">
                 <sequence/>
            </extension>
        </complexContent>
    </complexType>
    

    will be changed to

    <complexType name="AlreadyExistsException">
        <complexContent mixed="false">
            <extension base="tns1:RemoteException">
                <sequence />
             </extension>
         </complexContent>
    </complexType>
    <element name="AlreadyExistsException" type="tns1:AlreadyExistsException"/>