Architecture Overview

Ultimately behind-the-scenes ServiceStack is just built on top of ASP.NET's Raw IHttpAsyncHandler. Existing abstractions and xmlconfig-encumbered legacy ASP.NET providers have been abandoned, in favour of fresh, simple and clean Caching, Session and Authentication providers all based on clean POCOs, supporting multiple back-ends and all working seamlessly together. Our best-practices architecture is purposely kept simple, introduces minimal new concepts or artificial constructs that can all be eloquently captured in the diagram below:

Server Architecture

ServiceStack Logical Architecture View

Client Architecture

ServiceStack's Message-based design allows us to easily support typed, generic and re-usable Service Clients for all our popular formats:

ServiceStack HTTP Client Architecture

Having all clients share the same interface allow them to be hot-swappable at run-time without code changes and keep them highly testable where the same unit test can also serve as an XML, JSON, JSV, SOAP Integration Test.

By promoting clean (endpoint-ignorant and dependency-free) Service and DTO classes, your web services are instantly re-usable and can be hosted in non-http contexts as well. E.g. The client architecture when one of the built-in MQ Host is enabled:

ServiceStack MQ Client Architecture

Implementation

The entry point for all ASP.NET and HttpListener requests is in the ServiceStack.HttpHandlerFactory whose purpose is to return the appropriate IHttpHandler for the incoming request.

There are 2 distinct modes in any ServiceStack application:

  1. AppHost Setup and Configuration - Only done once for all services. Run only once on App StartUp.
  2. Runtime - Run on every request: uses dependencies, plugins, etc. defined in the AppHost. Each new request re-binds all IOC dependencies to a new service instance which gets disposed at the end of each request.

The implementation of this can be visualized below:

ServiceStack Overview

After the IHttpHandler is returned, it gets executed with the current ASP.NET or HttpListener request wrapped in a common IRequest instance.