Skip to content

Instantly share code, notes, and snippets.

@dgfitch
Created November 3, 2010 20:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dgfitch/661656 to your computer and use it in GitHub Desktop.
Save dgfitch/661656 to your computer and use it in GitHub Desktop.
A sample WCF host and client in F#, extremely simple but a starting point
open System
open System.ServiceModel
open System.ServiceModel.Description
[<ServiceContract(ConfigurationName = "PublishService", Namespace = "http://xyz.gov/PublishService")>]
[<ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)>]
type IPublishService =
[<OperationContract(Name="TestMethod")>]
abstract member TestMethod : name:string -> string
type PublishService() =
interface IPublishService with
member x.TestMethod (name:string) = "Hello " + name
end
let address = "http://localhost:4771"
let StartServer() =
use host = new ServiceHost(typeof<PublishService>, new Uri(address))
host.Description.Behaviors.Add(new ServiceMetadataBehavior(HttpGetEnabled = true));
host.Open()
printfn "Service is running at %s" (host.Description.Endpoints.[0].Address.ToString())
printfn "Press Enter to shut down service"
Console.ReadLine() |> ignore
let RunClient() =
let endpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof<IPublishService>),
new BasicHttpBinding(),
new EndpointAddress(address))
let factory = new ChannelFactory<IPublishService>(endpoint)
let channel = factory.CreateChannel()
let result = channel.TestMethod("there")
printfn "Got result: %s" result
@giuliohome
Copy link

Nice work! Remember that host.Open() requires admin permissions or - alternatively - you have to reserve the URL for the script's user from an eleveted cmd by configuring netsh http add urlacl url=http://+:4771/ user=domain\user

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment