Я хотел бы сделать простую связь один на один между двумя давно работающими процессами F # с использованием F #. Они будут обмениваться информацией регулярно каждые ок. 5 секунд. До сих пор я достиг этого момента:
#r "System.ServiceModel"
#r "System.Runtime.Serialization"
//#r @"d:\DLL\Protobuf\protobuf-net.dll"
#time "on"
open System.ServiceModel
[<ServiceContract>]
type IService =
[<OperationContract>]
// [<ProtoBuf.ServiceModel.ProtoBehavior>]
abstract Test: float [] [] [] -> string
type Service () =
interface IService with
member o.Test data = sprintf "Hello, %A" data
let server = System.Threading.Thread (fun () ->
let svh = new ServiceHost (typeof<Service>)
svh.AddServiceEndpoint (typeof<IService>, NetNamedPipeBinding(), "net.pipe://localhost/123") |> ignore
svh.Open () )
server.IsBackground <- true
server.Start()
let scf: IService = ChannelFactory.CreateChannel (NetNamedPipeBinding(), EndpointAddress "net.pipe://localhost/123")
let rnd = System.Random ()
let arr =
Array.init 100 (fun i ->
Array.init 10 (fun j ->
Array.init 10 (fun k ->
rnd.NextDouble()
)))
printfn "%s" (scf.Test arr)
Я получаю множество разных исключений, в основном из-за разных ограничений безопасности WCF.
Мои вопросы
- Что мне нужно сделать как минимум, чтобы заставить его работать?
- Правильно ли я написал код, чтобы сделать общение максимально быстрым?
- Я попытался включить сериализатор ProtoBuf (см. ProtoBehavior в коде), чтобы сделать сериализацию еще быстрее. Правильно ли я реализовал? Как я узнаю, что WCF действительно использует его или нет?