2011-09-30 31 views
6

Cố gắng chạy này trong F # tương tác:F # tương tác vs F # giải pháp và 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>) 

Bạn có thể sẽ thành công. Hãy thử tạo một giải pháp mới.

tham khảo:

  • System.Runtime.Serialization
  • System.ServiceModel

Dán đoạn mã sau vào 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>) 

Và chạy nó. Tôi nhận được lỗi sau:

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

Điều gì là sai?

PS: Tôi sử dụng Visual Studio 2010 Ultimate SP1

EDIT: chỉ để chắc chắn, C# tương đương hoạt động tốt

+0

Bạn đã kiểm tra kỹ để đảm bảo rằng bạn đang nhắm mục tiêu đúng phiên bản của thời gian chạy .NET? Khi tôi nhớ lại, mặc định cho các ứng dụng giao diện điều khiển F #, trong VS 2010, là .NET 4 Client Profile, là * không * toàn bộ lược tả .NET, đôi khi gây ra các loại "nó hoạt động ở đây nhưng không có" vấn đề. – pblasucci

Trả lời

7

Vấn đề thực sự là bạn cần phải có những cái tên cho các thông số trong WCF Operations .

Đây là giải pháp để lấy thông số có tên trong đó (tên là a giống như bạn đã làm) - tại sao nó hoạt động trong F # -Tích hoạt? Không có đầu mối, có thể nó đặt một số tên tiêu chuẩn cho các tham số trong đó. Cú pháp là hơi lạ nhưng bạn có thể xác định tên cho các thông số trong F #, hãy thử:

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

Chú ý: Tôi không biết nếu bạn cần member trong đó nhưng tôi chỉ kiểm tra một số tác phẩm của tôi và đã làm đặt nó vào đó. Tôi không có trình biên dịch xung quanh ATM vì vậy tôi sẽ để nó ở đó trong trường hợp bạn thực sự cần nó (nhưng tôi không nghĩ vậy)

+2

"thành viên" là không cần thiết. – jhamm

+0

Cảm ơn, điều đó đã giúp! Tôi không biết rằng các thông số của các thành viên giao diện có thể có tên là tốt. –

1

Tôi biết vấn đề này đã được đánh dấu là đã trả lời, nhưng tôi gặp thông báo ngoại lệ , vì một lý do hoàn toàn khác. Tôi chỉ đăng trong trường hợp người khác gặp cùng một vấn đề với nguyên nhân tương tự mà tôi có.

Trong trường hợp của mình, tôi đã sử dụng dotNET_Reactor để làm xáo trộn service.exe của tôi với các cờ '-exclude_types 1 -necrobit 1 -mapping_file 1' ngoài tệp -file và -targetfile.

Tôi chưa theo dõi thực tế "tại sao" nó không hoạt động, nhưng việc loại bỏ obfuscation đã giúp. Nó khá bực bội khi biết mọi thứ đã làm việc từ studio trực quan, nhưng việc cài đặt ứng dụng (đã bị máy chủ xây dựng làm xáo trộn) trên cùng một máy không thành công khi khởi động dịch vụ.

Bjørnar Sundsbø