Skip to content
mythz edited this page Jul 1, 2012 · 15 revisions

It's very easy to host ServiceStack in a console app or in a windows service. You just have to derive from AppHostHttpListenerBase instead of AppHostBase:

C# Console Host Example

	class Program {

		public class Hello {
			public string Name { get; set; }
		}

		public class HelloResponse {
			public string Result { get; set; }
		}

		public class HelloService : ServiceBase<Hello> 
		{
			protected override object Run(Hello request) 
			{
				return new HelloResponse { Result = "Hello, " + request.Name };
			}
		}

		const string ListeningOn = "http://localhost:1337";

		//Define the Web Services AppHost
		public class AppHost : AppHostHttpListenerBase {
			public AppHost() : base("StarterTemplate HttpListener", typeof(HelloService).Assembly) { }

			public override void Configure(Funq.Container container) {
				Routes
	                            .Add<Hello>("/hello")
	                            .Add<Hello>("/hello/{Name}");
			}
		}

		//Run it!
		static void Main(string[] args)
		{
			var appHost = new AppHost();
			appHost.Init();
			appHost.Start(ListeningOn);

			Console.WriteLine("AppHost Created at {0}, listening on {1}", DateTime.Now, ListeningOn);
			Console.ReadKey();
		}
	}

F# Example of the same service

	open System
	open ServiceStack.ServiceHost
	open ServiceStack.WebHost.Endpoints
	 
	type Hello = { mutable Name: string; }
	type HelloResponse = { mutable Result: string; }
	type HelloService() =
	    interface IService<Hello> with
	        member this.Execute (req:Hello) = { Result = "Hello, " + req.Name } :> Object
	 
	//Define the Web Services AppHost
	type AppHost =
	    inherit AppHostHttpListenerBase
	    new() = { inherit AppHostHttpListenerBase("Hello F# Services", typeof<HelloService>.Assembly) }
	    override this.Configure container =
	        base.Routes
	            .Add<Hello>("/hello")
	            .Add<Hello>("/hello/{Name}") |> ignore
	 
	//Run it!
	[<EntryPoint>]
	let main args =
	    let host = if args.Length = 0 then "http://*:1337/" else args.[0]
	    printfn "listening on %s ..." host
	    let appHost = new AppHost()
	    appHost.Init()
	    appHost.Start host
	    Console.ReadLine() |> ignore
	    0

When that's running you can call your hello service at http://localhost:1337/hello/World!

Host as a Windows or Linux Console Host, Windows Service or Linux Daemon

This will run in as a Console Host in any Operating System with .NET 3.5 or Mono installed. In addition this can also be wrapped-up and run inside a Windows Service or run as a Linux Daemon which you can optionally elect to serve behind Apache or Nginx reverse proxies.

Easily Convert to an ASP.NET Web Service

As both AppHostBase and AppHostHttpListenerBase follow the same API they are easily convertible between the two. Here's some step-by-step instructions showing you how to convert an F# Console Host to an ASP.NET Web Service on OSX!

Clone this wiki locally