2011-09-30 9 views
6

intenta ejecutar esto en C# interactivo:F # # interactiva vs solución de F y 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>) 

Es probable que tenga éxito. Intenta hacer una nueva solución.

Referencia:

  • System.Runtime.Serialization
  • System.ServiceModel

Pegue el código siguiente en 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>) 

y ejecutarlo. Me sale el siguiente error:

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

¿Qué pasa?

PS: Yo uso de Visual Studio 2010 Ultimate SP1

EDIT: sólo para asegurarse, el equivalente C# funciona bien

+0

¿Usted ha duplicado a comprobar para asegurarse de que está apuntando a la versión correcta de .NET tiempo de ejecución? Según recuerdo, el valor predeterminado para las aplicaciones de la consola F #, en VS 2010, es el .NET 4 Client Profile, que * no * es el perfil .NET completo, lo que a veces causa este tipo de tipos de "funciona aquí pero no está allí" cuestiones. – pblasucci

Respuesta

7

El problema es precisamente que es necesario tener nombres de los parámetros en WCF-Operaciones .

Aquí hay una solución para obtener los parámetros con nombre allí (lo llamó a al igual que lo hizo) - en cuanto a por qué está trabajando en F # -Interactivo? No hay pista, tal vez pone algunos nombres estándar para los parámetros allí. La sintaxis es un poco extraño, pero se puede definir los nombres de los parámetros en F #, pruebe:

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

NOTA: No sé si usted necesita el member de allí, pero acabo de revisar algunos de mis archivos e hice ponlo ahí. No tengo compilador en cajeros automáticos, así que lo dejaré allí en caso de que realmente lo necesite (pero no lo creo)

+2

"miembro" no es necesario. – jhamm

+0

¡Gracias, eso ayudó! No sabía que los parámetros de los miembros de la interfaz también pueden tener nombres. –

1

Sé que este problema se marcó como respondido, pero me encontré con el mismo mensaje de excepción por una razón completamente diferente. Acabo de publicar en caso de que alguien más experimente el mismo problema con la misma causa que tuve.

En mi caso, utilicé dotNET_Reactor para ofuscar mi service.exe con las banderas '-exclude_types 1 -necrobit 1 -mapping_file 1' además de -file y -targetfile.

No he rastreado el verdadero "por qué" no funcionó, pero la eliminación de la ofuscación ayudó. Fue bastante frustrante saber que todo funcionaba desde Visual Studio, pero la instalación de la aplicación (que fue ofuscada por el servidor de compilación) en la misma máquina falló al iniciar el servicio.

Bjørnar Sundsbø