Nachrichtenbasierte HTTP- und REST-Services mit

ServiceStack

Hardy Erlinger

hardy.erlinger@.netspectrum.de
www.netspectrum.de

Warum ServiceStack

HTTP Services bei Microsoft

  1. [.NET Framework 1.0, 2002] ASMX Web Services, HTTP einziges Protokoll.
  2. [.NET Framework 3.0, 2006] WCF: viele Protokolle, aber keine explizite REST Unterstützung. WCF selbst inkompatibel zu ASMX.
  3. [.NET Framework 3.5, 2008] WCF REST Support hinzugefügt: WebHttpBinding, WebHttpBehavior etc. (Dateiendung ".svc" zwingend Teil der Service-URL).
  4. [.NET Framework 3.5, 2008] ADO.NET Data Services -> später umbenannt zu WCF Data Services
  5. [ca. 2009] WCF REST Starterkit: Erweiterungen für WCF REST Support.
  6. [.NET Framework ?, 20??] WCF Web API, Vorgänger der ASP.NET Web API
  7. [ASP.NET MVC 4.0, 2012] ASP.NET Web API (inkompatibel mit WCF REST)

Was kommt als nächstes?!?

HTTP in ServiceStack

  • Von Anfang an Ausrichtung auf HTTP- und REST-Services
  • Kein Support für binäre Protokolle
  • Support für eine Vielzahl von Serialisierungsformaten:
    • JSON/JSV
    • XML
    • CSV
    • MessagePack
    • ProtoBuf
  • Nur geringfügige Änderungen der APIs seit 2008/2009

WCF vs. ServiceStack


public interface IWcfCustomerService
{
    Customer GetCustomerById(int id);
    List<Customer> GetCustomerByIds(int[] id);
    Customer GetCustomerByUserName(string userName);
    List<Customer> GetCustomerByUserNames(string[] userNames);
    Customer GetCustomerByEmail(string email);
    List<Customer> GetCustomerByEmails(string[] emails);
}
                

public class Customers : IReturn<List<Customer>>
{
    public int[] Ids { get; set; }
    public string[] UserNames { get; set; }
    public string[] Emails { get; set; }
}
                

Was ist ServiceStack

Laut Github Repo

ServiceStack: Thoughtfully architected, obscenely fast, thoroughly enjoyable web services for all.

Ansatz

  • Nachrichten stehen im Zentrum der Architektur "API First"
  • DTOs können auf Server und Client verwendet werden. Kein "Add Service reference" in Visual Studio erforderlich.
  • Hosting: IIS, Mono, self-hosting

Architektur

Bestandteile

Vita

  • Entstanden ca. 2008
    (erster Git Commit: 21.12.2008)
  • Autor: Demis Bellot
  • Bis einschließlich Version 3.x (Ende 2013) reines FOSS Projekt (BSD Lizenz).
  • Seit Version 4.0 (Frühjahr 2014) kommerzielles Produkt.
    • Starter Edition und v3.x nach wie vor kostenfrei verfügbar.
    • Indie Edition: 299,- USD pro Entwickler inkl. 1 Jahr Maintenance und Forum Support
    • Business Edition: 999,- USD pro Entwickler; wie Indie, jedoch zusätzlich 4 Support-Incidents
    • Diverse andere Lizenzformen: nach Server Cores, Enterprise-Lizenz etc.
    • Alle Details: https://servicestack.net/pricing

Demo

Hello ServiceStack!

IOC Container Support

  • ServiceStack nutzt Funq, einen sehr performanten Open Source IOC Container
  • Registrierungen werden im AppHost vorgenommen:
    
    public override void Configure(Container container)
    {
        container.RegisterAutoWired<MyType>();
        container.RegisterAutoWiredAs<MyType,IMyType>();
    }
                    
  • Adapter für andere Container einfach zu implementieren. Für Ninject, StructureMap, Windsor und Autofac bereits vorhanden.

Demo

IOC Support

Service Clients

Außerdem: ServiceStack JsonServiceClient.js, Silverlight-, Dart- und Message Queueing Clients sowie alles, was XML oder JSON versteht.

Demo

Service Clients

Request Validierung

Benutzt die Fluent Validation library:


public class RandomNumberRequestValidator
     : AbstractValidator<GetRandomNumber>
{
    public RandomNumberRequestValidator()
    {
        RuleFor(r => r.Lowerbound).GreaterThanOrEqualTo(0);
        RuleFor(r => r.Upperbound).LessThanOrEqualTo(200);
    }
}
                    

Demo

Request Validierung

Request- und Responsefilter

Option 1: Globale Filter

Werden im AppHost registriert:


//Add a request filter to check if the user has a session initialized
this.RequestFilters.Add((req, res, requestDto) => {
    var sessionId = req.GetCookieValue("user-session");
    if (sessionId == null)
    {
        res.ReturnAuthRequired();
    }
});
            

Filter wird ausnahmslos auf jeden Request angewendet.

Option 2: Filterattribute

  • Ermöglichen gezielte Anwendung von Filtern.
  • Beispiel: Service soll Accept-Language Header respektieren, um lokalisierte Antworten liefern zu können.

Request Filter Attribute


public class LanguageRequestFilterAttribute
                : RequestFilterAttribute
{
    // [...]

    public override void Execute(IHttpRequest req, IHttpResponse res,
                object requestDto)
    {
        string acceptLanguageHeader = req.Headers.Get("Accept-Language");

        // Parse the header
        // [...]

        // Set the language
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
    }
}
            

Response Filter Attribute


public class LanguageResponseFilterAttribute : ResponseFilterAttribute
{
    // [...]

    public override void Execute(IHttpRequest req, IHttpResponse res,
                object responseDto)
    {
        if (res.StatusCode != 401)
        {
            string language = Thread.CurrentThread.
                            CurrentUICulture.TwoLetterISOLanguageName;
            res.AddHeader("Content-Language", language);
            res.AddHeader("Vary", "Accept-Language");
        }
    }
}
            

Anwendung auf den Service


[LanguageRequestFilter]
[LanguageResponseFilter(ApplyTo.Get | ApplyTo.Post | ApplyTo.Put)]
public class MyService : Service
{
    // [...]
}
            

Anwendung auf Request Message


[LanguageRequestFilter]
public class MyRequestDto
{
    // [...]
}
            

Filter wird nur für diesen Request angewendet.

Service Authentication

ServiceStack authentication options

Sonstige Features

  • Razor support
  • Message Queues mit Redis und/oder RabbitMq
  • Auto-Mapping
  • async/await Support (v4.x)
  • Mono Hosting
  • Self Hosting, z.B. in einem Windows Service mit Topshelf
  • Swagger Plugin
  • Restricted Services
  • SOAP Support
  • etc.
  • etc.

Links

Fragen?

hardy.erlinger@.netspectrum.de

Vielen Dank!

Once you're on the 'Stack, you'll never look back.