2013-11-27 12 views
5

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 

कोई फर्क नहीं पड़ता कि मुझे क्या करना डबल्यूएसडीएल प्रकार प्रदाता को स्पष्ट नहीं कर सकते समारोह कॉल से:

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

उनमें से कोई भी काम करता है।

अन्य एंडपॉइंट्स को अक्षम करना और ईकनेक्ट क्लाइंट के लिए केवल एक को छोड़ना समस्या हल करता है, लेकिन मुझे यह भी नहीं पता कि मैं अन्य अंतराल की आवश्यकता को समाप्त कर सकता हूं या नहीं।

+0

मैं विचार है कि इस डबल्यूएसडीएल प्रकार प्रदाता में एक बग हो सकता है पर झुकाव रहा हूँ। ऐसा लगता है कि यदि आपके पास विभिन्न अनुबंधों के साथ कई अंतराल हैं, तो डब्लूएसडीएल प्रकार प्रदाता आपको प्रत्येक अलग-अलग अंतराल के लिए सभी विधियों देता है, फिर भी उन सभी एंडपॉइंट्स के लिए ओवरलोड को अन्य सभी एंडपॉइंट्स से मेल खाने वाले अलग-अलग रिटर्न प्रकारों के साथ ओवरलोड देता है। –

+0

मैं यहां गलत हो सकता हूं लेकिन मुझे लगता है कि सी # और एफ # तर्कों के लिए समान प्रकार के हस्ताक्षर के साथ अधिभार को अस्वीकार कर देगा, भले ही रिटर्न प्रकार अलग हों, फिर भी यह .NET फ्रेमवर्क में संभव हो सकता है जो डब्लूएसडीएल प्रकार प्रदाता सक्षम हो सकता है उत्पन्न करते हैं। –

+0

जब मैंने डब्लूएसडीएल प्रकार प्रदाता की कोशिश की तो मुझे इस तरह की समस्याओं का एक गुच्छा मिला। आईआईआरसी, वे एफ # और टाइप प्रदाताओं के लिए विशिष्ट कुछ भी के बजाय अंतर्निहित सी # कोड जनरेटर के साथ अक्सर समस्याएं हैं। –

उत्तर

0

स्कीमा या प्रकार प्रदाता से परिचित नहीं है, लेकिन ओवरलोड को डब्लूएसडीएल मानक द्वारा समर्थित नहीं है। यदि डब्ल्यूएसडीएल कार्यान्वयन से रनटाइम पर उत्पन्न होता है (जैसा कि अक्सर होता है), रनटाइम ऐसे अमान्य डब्लूएसडीएल का उत्पादन कर सकता है।

0

मैं जिस विधि को आमंत्रित करना चाहता था उसे ढूंढने के लिए प्रतिबिंब का उपयोग कर इस समस्या को दूर करने में सक्षम था, और इसे गतिशील रूप से बुलाया।

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 
संबंधित मुद्दे