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: What is the shortest C#/F# code (hard time understanding XML configuration files ^_^") I could write to create a router to it at?: MEX should also be routed properly so that clients can use the router to discover service methods.net.tcp://remotehost:4508
net.tcp://localhost:4508
svcutil net.tcp://localhost:4508
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