Почему поставщик типов WSDL не может устранить неоднозначность перегрузки?

От

#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

Независимо от того, что я делаю, поставщик типа WSDL не может устранить неоднозначность вызова функции:

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

Ни один из них не работает.

Отключение других конечных точек и оставление только одной для eConnectClient решает проблему, но я даже не знаю, могут ли мне в конечном итоге понадобиться другие конечные точки.


person David Grenier    schedule 27.11.2013    source источник
comment
Я склоняюсь к мысли, что это может быть ошибка в поставщике типов WSDL. Кажется, что если у вас есть несколько конечных точек с разными контрактами, поставщик типа WSDL предоставляет вам все методы для каждой из разных конечных точек, но дает перегрузки для каждой из этих конечных точек с разными типами возврата, соответствующими всем другим конечным точкам.   -  person David Grenier    schedule 28.11.2013
comment
Я могу ошибаться здесь, но я думаю, что C# и F# запретят перегрузки с идентичной сигнатурой типа для аргументов, даже если возвращаемые типы будут разными, но это может быть возможно в среде .NET, которую поставщик типов WSDL, похоже, может генерировать .   -  person David Grenier    schedule 28.11.2013
comment
Я обнаружил кучу подобных проблем, когда попробовал поставщика типов WSDL. IIRC, они часто связаны с базовым генератором кода C#, а не с чем-то специфичным для F# и поставщиков типов.   -  person J D    schedule 30.11.2013
comment
возможный дубликат Метод 'XYZ' не может быть отражен   -  person Paul Sweatte    schedule 03.10.2014


Ответы (2)


Не знаком со схемой или поставщиком типов, но перегрузки не поддерживаются стандартом WSDL. Если WSDL генерируется во время выполнения из реализации (как это часто бывает), среда выполнения может создать такой недопустимый WSDL.

person Eugene Tolmachev    schedule 02.06.2015

Я смог обойти эту проблему, используя отражение, чтобы найти метод, который я хотел вызвать, и вызвать его динамически.

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
person John Atwood    schedule 04.01.2017