2011-09-30 27 views
6

tenta di eseguire questo in F # interattivo:F # interattivo vs. # soluzione F e WCF

#r "System.ServiceModel" 
#r "System.Runtime.Serialization" 

open System.ServiceModel 

[<ServiceContract>] 
type IWCF = 
    [<OperationContract>] 
    abstract Ping: float -> unit 

type WCF() = 
    interface IWCF with 
    member o.Ping a = printfn "Hello, %g" a 

let svh = new ServiceHost (typeof<WCF>) 

Si avrà probabilmente successo. Prova a creare una nuova soluzione.

Riferimento:

  • System.Runtime.Serialization
  • System.ServiceModel

Incollare il seguente codice in Program.fs:

open System.ServiceModel 

[<ServiceContract>] 
type IWCF = 
    [<OperationContract>] 
    abstract Ping: float -> unit 

type WCF() = 
    interface IWCF with 
    member o.Ping a = printfn "Hello, %g" a 

let svh = new ServiceHost (typeof<WCF>) 

ed eseguirlo. Viene visualizzato il seguente errore:

All parameter names used in operations that make up a service contract must not be null. Parameter name: name

Cosa c'è che non va?

PS: io uso Visual Studio 2010 Ultimate SP1

EDIT: solo per assicurarsi che, il C# equivalenti funziona bene

+0

Avete raddoppiato-controllato per assicurarsi che si sta targeting giusta versione di .NET runtime? Come ricordo, l'impostazione predefinita per le applicazioni della console F #, in VS 2010, è il profilo client .NET 4, che * non * è il profilo .NET completo, che a volte causa questo tipo di "funziona qui ma non lì" tipi di problemi. – pblasucci

risposta

7

Il problema è infatti che è necessario avere i nomi per i parametri in WCF-Operations .

Ecco una soluzione per ottenere i parametri denominati lì (denominata a proprio come hai fatto tu) - sul motivo per cui funziona in F # -Interactive? Nessun indizio, forse mette alcuni nomi standard per i parametri. La sintassi è un po 'strano, ma è possibile definire i nomi per i parametri in F #, provare:

[<ServiceContract>] 
type IWCF = 
    [<OperationContract>] 
    abstract member Ping: a:float -> unit 

NOTA: Non so se avete bisogno della member in là, ma ho appena controllato alcuni file e ha fatto mettilo lì dentro Non ho alcun compilatore in giro per ATM quindi lo lascerò stare lì nel caso in cui ne hai davvero bisogno (ma non credo)

+2

"membro" non richiesto. – jhamm

+0

Grazie, questo ha aiutato! Non sapevo che i parametri dei membri dell'interfaccia possano avere anche nomi. –

1

So che questo problema è stato contrassegnato come risposta, ma ho trovato lo stesso messaggio di eccezione , per una ragione completamente diversa. Pubblicizzo solo nel caso in cui qualcun altro abbia riscontrato lo stesso problema con la stessa causa che ho avuto.

Nel mio caso, ho usato dotNET_Reactor per offuscare il mio service.exe con i flag'exclude_types 1 -necrobit 1 -mapping_file 1 'oltre a -file e -targetfile.

Non ho rintracciato l'effettivo "perché" non ha funzionato, ma l'eliminazione dell'offuscamento ha aiutato. È stato piuttosto frustrante sapere che tutto funzionava da Visual Studio, ma l'installazione dell'applicazione (che era stata offuscata dal server di build) sulla stessa macchina non è riuscita all'avvio del servizio.

Bjørnar Sundsbø