2013-11-27 9 views
5

DaPerché il provider del tipo WSDL non può disambiguare il sovraccarico?

#r "FSharp.Data.TypeProviders" 
#r "System.ServiceModel" 

open Microsoft.FSharp.Data.TypeProviders 

[<Literal>] 
let serviceAddress = "http://localhost/Microsoft/Dynamics/GP/eConnect/mex" 

type Dynamics = WsdlService<serviceAddress> 
type DynTypes = Dynamics.ServiceTypes.SimpleDataContextTypes 
type Address = System.ServiceModel.EndpointAddress 

Non importa quello che faccio prestatore tipo di WSDL non può disambiguare la chiamata di funzione:

let svc: DynTypes.eConnectClient = Dynamics.GeteConnectServiceEndpoint() 
let svc2 = (Dynamics.GeteConnectServiceEndpoint : unit -> DynTypes.eConnectClient)() 
let svc3 = (Dynamics.GeteConnectServiceEndpoint : Address -> DynTypes.eConnectClient)(Address serviceAddress) 

Nessuno di loro opere.

Disabilitare gli altri endpoint e lasciare solo quello per eConnectClient risolve il problema, ma non so nemmeno se potrei finire per aver bisogno degli altri endpoint.

+0

Mi sto appoggiando all'idea che questo potrebbe essere un bug nel provider del tipo WSDL. Sembra che se si hanno più endpoint con contratti diversi, il provider del tipo WSDL fornisce tutti i metodi per ciascun endpoint diverso e fornisce sovraccarichi per ciascuno di questi endpoint con tipi di restituzione diversi che corrispondono a tutti gli altri endpoint. –

+0

Qui potrei sbagliarmi, ma penso che C# e F # non consentirebbero sovraccarichi con lo stesso tipo di firma per gli argomenti, anche se i tipi di ritorno sarebbero diversi, tuttavia questo potrebbe essere possibile in .NET framework che il provider di tipo WSDL sembra essere in grado di creare. –

+0

Ho trovato un sacco di problemi come questo quando ho provato il provider del tipo WSDL. IIRC, sono spesso problemi con il generatore di codice C# sottostante piuttosto che su qualcosa di specifico per F # e provider di tipi. –

risposta

0

Non si conosce lo schema o il provider del tipo, ma gli overload non sono supportati dallo standard WSDL. Se il WSDL viene generato in fase di runtime dall'implementazione (come spesso accade), il runtime potrebbe produrre un WSDL non valido.

0

Sono stato in grado di superare questo problema utilizzando la reflection per trovare il metodo che volevo richiamare e invocato dinamicamente.

let noteServiceType = typedefof<NoteService> 
let creatorMethod = 
    noteServiceType.GetMethods() 
    |> Seq.filter (fun staticMethod -> 
     staticMethod.Name = "GetCustomBinding_IIntakeNoteManager" 
     && staticMethod.ReturnType = typedefof<NoteService.ServiceTypes.SimpleDataContextTypes.IntakeNoteManagerClient> 
     && staticMethod.GetParameters().Length = 0) 
    |> Seq.toList 

let creatorMethod = creatorMethod |> Seq.head 

let client = creatorMethod.Invoke(null, [||]) :?> NoteService.ServiceTypes.SimpleDataContextTypes.IntakeNoteManagerClient 
Problemi correlati