WCF 4.0 routing with MetadataExchange using System.ServiceModel.Routing.RoutingService in F#

I posted a simple question on stackoverflow.com:

I have service with working MEX at:

net.tcp://remotehost:4508

What is the shortest C#/F# code (hard time understanding XML configuration files ^_^") I could write to create a router to it at?:

net.tcp://localhost:4508

MEX should also be routed properly so that clients can use the router

svcutil net.tcp://localhost:4508

to discover service methods.

and as has been usual with its users no one has been able to answer my question before I could come up with my own answer.

Here's how to use F# and WCF 4.0 to route a service with NetTcp and MexTcp endpoints no XML involved, pure code:

namespace CORSISmodule Application =    open System    open System.ServiceModel    open System.ServiceModel.Routing    open System.ServiceModel.Dispatcher    open System.ServiceModel.Description    let createSimpleRouter createBinding (routerAddress : string) serviceAddress =         let routerType = typeof<IRequestReplyRouter>        let routerContract = ContractDescription.GetContract(routerType)        let endpoint address = new ServiceEndpoint(routerContract, createBinding(), new EndpointAddress(address))        let serviceEndpoints = [| endpoint serviceAddress |]        let configuration = new RoutingConfiguration()        configuration.FilterTable.Add(new MatchAllMessageFilter(), serviceEndpoints)        let host = new ServiceHost(typeof<RoutingService>)        ignore <| host.AddServiceEndpoint(routerType, createBinding(), routerAddress)        host.Description.Behaviors.Add(new RoutingBehavior(configuration))        host            [<EntryPoint>]    let main(args) =        let (routerAddress, serviceAddress) =            match args with            | [| ra; sa |] -> (ra, sa)            | _ -> ("net.tcp://localhost:4508/", "net.tcp://remotehost:4508/")        let netTcp() = new NetTcpBinding(SecurityMode.None)        let mexTcp() = MetadataExchangeBindings.CreateMexTcpBinding()        let tcpRouter = createSimpleRouter netTcp  routerAddress           serviceAddress        let mexRouter = createSimpleRouter mexTcp (routerAddress + "mex") (serviceAddress + "mex")        tcpRouter.Open()        mexRouter.Open()        Console.WriteLine("routing ...\n{0} <-> R:{1}", serviceAddress, routerAddress)        ignore <| Console.ReadKey true        0

Posted via email from corsis

Comments

Popular posts from this blog

Levenshtein Distance Algorithm: Fastest Implementation in C#

WordSmith Tools 5.0, Tenka Text in China

Mono 1.2.5 binaries for Solaris 10/x86